EADDRINUSE错误,用于在不同的path上打开websocket,但在nodejs中打开相同的端口

我正在创build一个基于ws websocket在nodejs中的多房间聊天应用程序。 我可以做单一的聊天室工作,但创build第二个房间时,我得到EADDRINUSE错误。 错误是因为我已经在第一个房间使用了websocket端口。 我怎样才能创build第二个房间在不同的path相同的端口。

例如:

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

这给错误:错误:听EADDRINUSE 8080

谢谢,罗宾

这里的问题是,每个WebSocketServer为HTTP服务器上的升级事件添加一个新的侦听器,并且在发出该事件时,会在所有服务器上调用handleUpgrade 。 这是因为pathvalidationclosures了path不匹配的连接。

他们的方式,你使用,为同一端口上的不同path的networking套接字是不是一个好主意,因为在你的情况下,连接到something.com/a将首先build立a ,然后closuresb因为他们都写相同的sockets。

为了有多个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(); } });