【问题标题】:socket.io client connection cannot be made on the 2nd timesocket.io 客户端第二次无法连接
【发布时间】:2013-09-26 19:22:20
【问题描述】:

目前,我正在使用 nodejs express 实现一个 API,然后它需要连接到 socket.io 并发送事件。

API位于socket.io-client(客户端),它连接到socket.io(服务器)

第一次 API 调用:成功

在第一次调用 API 时建立连接,发送消息并断开套接字,并在客户端和服务器端调用“断开”回调。

第二次 API 调用:失败

第二次调用API时,无法与服务器建立连接,客户端的'client'回调没有被调用。

第三次 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;

    });
});

【问题讨论】:

  • 请显示导致此结果的代码。

标签: node.js express socket.io


【解决方案1】:

您只是遇到了 Socket.IO 的众多“功能”或“错误”之一,这取决于您如何看待。 Socket.IO 试图变得聪明并重用连接(这实际上会导致很多连接问题)解决此问题的方法是在您的io.connect 中使用force new connection 选项:

io.connect('http://127.0.0.1:9002', { 'force new connection': true });

如果您使用 socket.io 转换器,您还可以使用 https://github.com/primus/primus 包装 Socket.IO。在内部,它完全取消了io.connect 的使用,并使用了更底层的io.Socket 构造函数来创建更稳定的连接,就像使用普通的socket.io 一样。

【讨论】:

  • 感谢您的回答,我将 io.connect 与 keep alive 一起使用,看起来工作正常
  • force new connection 从 socket.io 1.0 起已更改为 forceNew
  • force new connection 仍然有效(向后兼容)。使用 socket.io 1.3.7 测试。
【解决方案2】:

使用套接字 1.0+,您必须使用它来强制建立新连接。

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

【讨论】:

    猜你喜欢
    • 2012-12-04
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多