On Mac and on Raspi same error: EADDRINUSE: address already in use 0.0.0.0:9092

On Mac and on Raspi same error: EADDRINUSE: address already in use 0.0.0.0:9092

发生了什么:

我在本地机器上 运行ning kafka 和 zookeeper 以及 docker-compose.yml。使用 server.js 我总是能够 运行 一个节点 websocket 服务器来传输消息。

我还通过 ssh 连接到 raspi 4。 raspi 和我的机器在同一个网络中,还有 运行s kafka 和 zookeeper。

如果我 运行 server.js,我现在会以某种方式收到一条错误消息(如下所示)。我在 raspi 和我的 macbook 上都尝试了 运行ning 脚本,我总是收到相同的消息。

我尝试了以下方法

脚本运行宁

docker-compose.yml:

version: "3"
services:
    zookeeper:
        image: 'bitnami/zookeeper:latest'
        container_name: 'zookeeper'
        ports:
        - '2181:2181'
        environment:
        - ALLOW_ANONYMOUS_LOGIN=yes
    kafka:
        image: 'bitnami/kafka:latest'
        container_name: 'kafka'
        ports:
        - '9092:9092'
        environment:
        - KAFKA_BROKER_ID=1
        - KAFKA_LISTENERS=PLAINTEXT://:9092
        - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
        - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
        - ALLOW_PLAINTEXT_LISTENER=yes
        depends_on:
        - zookeeper

server.js

const WebSocket = require("ws");
var Kafka = require('no-kafka');

const wss = new WebSocket.Server({ port: "9092" });

wss.on("connection", ws => {
    console.log("Kafka is connected");

    // Create an instance of the Kafka consumer
    const consumer = new Kafka.SimpleConsumer;
    var data = function (messageSet, topic, partition) {
        messageSet.forEach(function (m) {
            console.log(topic, partition, m.offset, m.message.value.toString('utf8'));
            ws.send(m.message.value.toString('utf8'))
        });
    };

    ws.on("close", () => {
        console.log("Client has disconnected");
    });

    // Subscribe to the Kafka topic
    return consumer.init().then(function () {
        return consumer.subscribe('test', data);
    });
});

错误信息

(base) ➜  websocketserver git:(branch_me) ✗ node server/server.js         
events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE: address already in use 0.0.0.0:9092
    at Server.setupListenHandle [as _listen2] (net.js:1314:16)
    at listenInCluster (net.js:1362:12)
    at doListen (net.js:1499:7)
    at processTicksAndRejections (internal/process/task_queues.js:85:21)
Emitted 'error' event on WebSocketServer instance at:
    at Server.WebSocketServer._onServerError (/Users/jumue/virtual7/tasks/0006_lui_dashboard/websocketserver/server/node_modules/ws/lib/WebSocketServer.js:82:50)
    at Server.emit (events.js:315:20)
    at emitErrorNT (net.js:1341:8)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  code: 'EADDRINUSE',
  errno: -48,
  syscall: 'listen',
  address: '0.0.0.0',
  port: 9092
}

在您的 server.js 代码中,您试图在 Kafka 已经分配的端口 9092 上创建一个 WebSocket 服务器。

你最好check npm documentation or github documentation。您可以将您的 Kafka 配置到另一个端口并相应地配置您的 SimpleConsumer(使用 connectionString)。