我正在创建一个基于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
谢谢, 罗宾
答案 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();
}
});