连接到不同名称空间时的socketIO握手行为

我遇到了socketIO(nodejs)和使用多个命名空间的麻烦。 也许我误解了如何使用它,但这是我理解它应该如何工作。

服务器端(nodejs)

io.of('/game').on('connection', socket => { console.log(socket.handshake.query); console.log('user connected to game socket', socket.id); }) io.of('/api').on('connection',socket => { console.log(socket.handshake.query); console.log('user connected to api socket', socket.id); } 

客户端(浏览器)

 function test (){ gameSocketTest = io.connect('http://localhost:4003/game',{query:{test:'test'}}); apiSocketTest = io.connect('http://localhost:4003/api'); } 

奇怪的是,查询(我只发送到“游戏”命名空间)到达两个处理程序,也是api之一。

如果我将客户端代码的顺序反转为:

 function test (){ apiSocketTest = io.connect('http://localhost:4003/api'); gameSocketTest = io.connect('http://localhost:4003/game',{query:{test:'test'}}); } 

握手中的查询在两个处理器服务器端都是空的。 所以我的结论是,这种或那种相同的握手是用于这两个连接(但套接字ID是不同的两个)。

是不是可以做我想做的事? 如果是这样,我不理解这个奇怪的握手行为。

根据我的理解,在客户端调用“io.connect()”应该创build2个独立的套接字客户端,每个客户端都有自己的握手。

谢谢你的帮助!

安德里斯

你必须明确地打开新的连接,因为Socket.IO试图变得聪明并重新使用连接(这实际上导致了很多连接问题)绕过这个的方法是在你的io.connect中使用强制新的连接选项

 gameSocketTest = io.connect('http://localhost:4003/game',{query:{test:'test'}}); apiSocketTest = io.connect('http://localhost:4003/api', {'force new connection': true}); 

从文档

被调用时,它会为给定的URL创build一个新的pipe理器,并尝试重新使用现有的pipe理器进行后续调用,除非Multiplex选项以false传递。 传递这个选项相当于传递“force new connection”:true