EADDRINUSE错误在不同路径上打开websocket但在nodejs中打开相同的端口

时间:2017-10-17 18:20:04

标签: node.js websocket

我正在创建一个基于nodejs中的ws websockets的多房间聊天应用程序。我可以让单个聊天室工作,但在创建第二个房间时,我得到EADDRINUSE错误。错误是因为我已经在第一个房间使用了websocket端口。如何在不同路径的同一端口上创建第二个房间。

例如:

var WebSocketServer = require('ws').Server;
a = new WebSocketServer({port:8080, path:'/a'}), 
b = new WebSocketServer({port:8080, path:'/b'});

这会给出错误:错误:听EADDRINUSE 8080

谢谢, 罗宾

1 个答案:

答案 0 :(得分:1)

这里的问题是每个WebSocketServer在HTTP服务器上为升级事件添加一个新的侦听器,当发出该事件时,在所有服务器上调用handleUpgrade。 这是因为路径验证关闭了路径mismatch上的连接。

他们使用的方式,对于网络套接字在同一端口上的不同路径不是一个好主意,因为在您的情况下,首先会在something.com/a上建立与a的连接,然后由b关闭,因为它们都写在同一个套接字上。

为了拥有多个WebSocket服务器和一个共享HTTP服务器,开发人员可以使用以下内容:

const wss1 = new WebSocket.Server({ noServer: true });
const wss2 = new WebSocket.Server({ noServer: true });
const server = http.createServer();

server.on('upgrade', (request, socket, head) => {
  const pathname = url.parse(request.url).pathname;

  if (pathname === '/a') {
    wss1.handleUpgrade(request, socket, head, (ws) => {
      wss1.emit('connection', ws);
    });
  } else if (pathname === '/b') {
    wss2.handleUpgrade(request, socket, head, (ws) => {
      wss2.emit('connection', ws);
    });
  } else {
    socket.destroy();
  }
});