Node.js 怪异的Socket.IO行为:事件“;“关于联系”;及;“断开连接时”;几乎发生在同一类型

Node.js 怪异的Socket.IO行为:事件“;“关于联系”;及;“断开连接时”;几乎发生在同一类型,node.js,websocket,socket.io,Node.js,Websocket,Socket.io,在socket io服务器上,我有如下功能: io.sockets.on('connection',function(client) { console.log(client.id + ' connected at '+(new Date()).getTime()); client.on('disconnect',function() { console.log(client.id + ' DISCONNECTED at '+(new Date()).getTim

在socket io服务器上,我有如下功能:

io.sockets.on('connection',function(client) {
    console.log(client.id + ' connected at '+(new Date()).getTime());
    client.on('disconnect',function() {
        console.log(client.id + ' DISCONNECTED at '+(new Date()).getTime());
    });
});
我的问题是这种情况会发生:

   debug - client authorized
   info  - handshake authorized 15229479751557595508
   debug - setting request GET /socket.io/1/websocket/15229479751557595508
   debug - set heartbeat interval for client 15229479751557595508
   debug - client authorized for 
   debug - websocket writing 1::
15229479751557595508 connected at 1313769716321
   debug - websocket received data packet 5:::{"name":"estimatepp","args":[9]}
   debug - websocket received data packet 5:::{"name":"ready","args":[null]}
   info  - transport end
   debug - set close timeout for client 15229479751557595508
   debug - cleared close timeout for client 15229479751557595508
   debug - cleared heartbeat interval for client 15229479751557595508
15229479751557595508 DISCONNECTED at 1313769716454
   debug - discarding transport
我不知道这是否正常,但正如您所看到的,客户端
15229479751557595508
1313769716321
处连接,在
1313769716454
处断开,只需133毫秒(该数字始终为132或133)。我不是命令客户在发生什么事情后断开连接

你知道为什么会这样吗

我还有一个疑问。如果我在io.sockets.on上侦听连接事件,我是否也应该在那里侦听断开连接事件?除了那里没有客户

监听断开连接的正确方法是什么

谢谢你的帮助

编辑:您可以忽略这些行

debug - websocket received data packet 5:::{"name":"estimatepp","args":[9]}
debug - websocket received data packet 5:::{"name":"ready","args":[null]}

这是我正在做的项目的一部分。也许问题是它只是接收这些事件,然后因为有一段时间没有活动,所以它关闭了连接?但这不是我们想要的行为,是吗?

您发布的服务器端代码很好,应该可以正常工作。检查客户端代码中的bug(或在此处发布客户端代码)。如果没有,请尝试其他浏览器


关于您的
断开连接
事件

您有一个
io.sockets.on(“connection”,function(client){…})
事件处理程序,当建立一个新连接时,将为该连接创建一个会话并存储在客户机变量中

然后将事件处理程序(如
disconnect
one)附加到此
client
对象

现在,当该客户端断开连接时,将调用附加到该特定
客户端
对象的
断开
事件处理程序


此外,正如您在中所看到的,
io.sockets.on
仅公开
连接
事件。

您发布的服务器端代码很好,应该可以按预期工作。检查客户端代码中的bug(或在此处发布客户端代码)。如果没有,请尝试其他浏览器


关于您的
断开连接
事件

您有一个
io.sockets.on(“connection”,function(client){…})
事件处理程序,当建立一个新连接时,将为该连接创建一个会话并存储在客户机变量中

然后将事件处理程序(如
disconnect
one)附加到此
client
对象

现在,当该客户端断开连接时,将调用附加到该特定
客户端
对象的
断开
事件处理程序


此外,正如您在中所看到的,
io.sockets.on
只公开了
连接
事件。

作为问题的创建者,我有类似的想法

以毫秒为单位的时间可能是您到服务器的往返时间,或者管理与客户机的连接所需的时间等等。因此,我不想为时间因素操心太多

当我手动和反复刷新客户机时,我会得到相同的结果。在半秒到一秒之间。这似乎造成了一种情况,否则只能在网络质量较差的情况下发生

我可以在日志中看到,在断开与相同socket.id的连接之前,我获得了连接。
连接的客户端:qEcxQQCivSyKJVbF85dc 客户端已断开连接:qEcxQQCivSyKJVbF85dc

但是,在这种情况下,我的on.disconnect事件不会触发

在断开连接时,我清理了连接的客户端的本地对象,我可以看到我有一个客户端留在那里,当我分析socket.connected状态时,它已断开连接

因此,在某些情况下,上述场景会导致断开连接事件不会触发

可能是由于时间、异步、网络质量等原因

有两条路要走

  • 根据这些约束或条件构建应用程序
  • 找一个能想出更可靠的方法来监听on.disconnect的人,正如最初的问题所回避的那样,它不涉及连接到特定的套接字客户端 这就像当客户端使用相同的id再次连接时,事件侦听器被覆盖。更通用的断开事件侦听器会忽略这一点,但可能会导致其他问题


    我个人赞成选择1。而是创建一个垃圾收集器,当客户端断开连接时,它会清理我的本地客户端阵列

    我和这个问题的创造者有着相似的想法

    以毫秒为单位的时间可能是您到服务器的往返时间,或者管理与客户机的连接所需的时间等等。因此,我不想为时间因素操心太多

    当我手动和反复刷新客户机时,我会得到相同的结果。在半秒到一秒之间。这似乎造成了一种情况,否则只能在网络质量较差的情况下发生

    我可以在日志中看到,在断开与相同socket.id的连接之前,我获得了连接。
    连接的客户端:qEcxQQCivSyKJVbF85dc 客户端已断开连接:qEcxQQCivSyKJVbF85dc

    但是,在这种情况下,我的on.disconnect事件不会触发

    在断开连接时,我清理了连接的客户端的本地对象,我可以看到我有一个客户端留在那里,当我分析socket.connected状态时,它已断开连接

    因此,在某些情况下,上述场景会导致断开连接事件不会触发

    可能是由于时间、异步、网络质量等原因

    有两条路要走

  • 根据这些约束或条件构建应用程序
  • 找一个能想出更可靠的方法来监听on.disconnect的人,正如最初的问题所回避的那样,它不涉及连接到特定的套接字客户端 这就像当客户端使用相同的id再次连接时,事件侦听器被覆盖