socket.io客户端连接第二次无法建立

8
目前,我正在使用nodejs express编写一个API,并连接到socket.io并发送事件。
该API位于socket.io-client(客户端),它连接到socket.io(服务器)。
第1个API调用:成功
当API第一次调用时,连接建立成功,消息被发送,然后可以断开socket连接,在客户端和服务器端都调用了“disconnect”回调函数。
第2个API调用:失败
当API第二次被调用时,无法连接到服务器,“client”回调函数在客户端未被调用。
第3个API调用:成功
然后我尝试重新启动客户端,保持其他事项不变。再次调用API,成功连接到socket.io,并一切正常。
有人能解释一下背后的逻辑吗?
更新
client.js
   App.getByUserId(message.to_id, function(error, app) {
  var  socket = io.connect('http://127.0.0.1:9002');
  socket.on('connect', function(){
  console.log("client connect socket id:" + socket.id);
    console.log("appkey:" + app.private_token);
    socket.emit('appkey.check',{appkey: app.private_token, uuid: message.to_id.uuid},    function(data){
        socket.emit("forceDisconnect");
        socket = null;

    });
});

请展示导致此结果的代码。 - hexacyanide
2个回答

12
您刚刚遇到了 Socket.IO 的一项“特性”或“bug”,具体取决于您的看法。Socket.IO 试图聪明地重用连接(实际上会导致许多连接问题)解决方法是在 io.connect 中使用 force new connection 选项: io.connect('http://127.0.0.1:9002', { 'force new connection': true }); 另外,您还可以使用 https://github.com/primus/primus,它在使用 socket.io 转换器时包装了 Socket.IO。在内部,它完全删除了对 io.connect 的使用,并使用更低级别的 io.Socket 构造函数创建更稳定的连接,这比使用原始的 socket.io 更为可靠。

谢谢你的回答,我使用带有保持连接功能的io.connect,看起来工作正常。 - Sanvi Lu
7
自socket.io 1.0版本以后,“force new connection”已更改为“forceNew”。 - c.hill
“force new connection” 仍然有效(向后兼容)。已在 socket.io 1.3.7 上进行测试。 - arnold

0

使用Socket 1.0+,您必须使用此选项来强制建立新连接。

io.connect(SERVER_IP, { 'forceNew': true });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接