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

And*_*len 5 node.js socket.io

我在使用 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);
}
Run Code Online (Sandbox Code Playgroud)

客户端(浏览器)

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

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

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

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

握手中的查询在两个处理程序服务器端都是空的。所以我的结论是,两个连接都会以某种方式使用相同的握手(但是两者的套接字 ID 不同)。

“uberhaupt”有可能做我想做的事吗?如果是这样,我对这种奇怪的握手行为不理解什么。

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

谢谢你的帮助!

安德里斯

Med*_*uly 5

您必须显式打开新连接,因为 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});
Run Code Online (Sandbox Code Playgroud)

来自文档

调用时,它会为给定的 URL 创建一个新的 Manager,并尝试在后续调用中重用现有的 Manager,除非使用 false 传递 Multiplex 选项。传递此选项相当于传递“强制新连接”:true