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

时间:2016-03-16 16:24:33

标签: 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);
}

客户端(浏览器)

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对于两者都不同)。

是否可以“uberhaupt”做我想做的事情?如果是这样,我不理解这种奇怪的握手行为。

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

感谢您的帮助!

安德里斯

1 个答案:

答案 0 :(得分:2)

您必须显式打开新连接,因为Socket.IO会尝试智能并重新使用连接(实际上会导致很多连接问题)解决这个问题的方法是使用io.connect中的force new connection选项

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

From docs

  

调用时,会为给定的URL创建一个新的Manager,然后尝试   重新使用现有的Manager进行后续调用,除非   多路复用选项与false一起传递。传递此选项相当于传递强制新连接':true