【问题标题】:Weird Socket.IO behavior: events "on connection" and "on disconnect" happen almost at the same type奇怪的 Socket.IO 行为:“连接时”和“断开连接”事件几乎以相同的类型发生
【发布时间】:2011-08-19 16:10:19
【问题描述】:

在套接字 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

我不知道这是否正常,但如您所见,客户端 152294797515575955081313769716321 连接并在 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]}

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

【问题讨论】:

    标签: node.js websocket socket.io


    【解决方案1】:

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


    关于您的disconnect 活动。

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

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

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

    此外,正如您在Exposed Events — Socket.io 中看到的那样,io.sockets.on 只公开了connection 事件。

    【讨论】:

      【解决方案2】:

      我与问题的创建者有类似的想法。

      以毫秒为单位的时间可能是您到服务器的往返时间或管理与客户端的连接所花费的时间等。所以我不会太在意时间因素。

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

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

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

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

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

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

      两条路。

      1. 根据这些约束构建应用程序或
      2. 找一个能想出一个更可靠的方法来监听 on.disconnect 的人,正如最初的问题所避开的那样,它不涉及连接到特定的套接字客户端。

      就像当客户端使用相同的 id 再次连接时,事件侦听器被覆盖。更通用的断开连接事件侦听器会忽略这一点,但可能会导致其他问题。

      我个人选择选项 1。而是创建一个垃圾收集器,如果它们断开连接,它会清理我的本地客户端数组。

      【讨论】:

        猜你喜欢
        • 2011-11-03
        • 2019-05-01
        • 2018-01-28
        • 2013-08-01
        • 2014-01-08
        • 2021-01-28
        • 1970-01-01
        • 2014-01-02
        • 2016-07-08
        相关资源
        最近更新 更多