奇怪的Socket.IO行为:事件“连接”和“断开连接”几乎发生在相同的types

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

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

您发布的服务器端代码很好,应该按预期工作。 检查你的客户端代码中的错误(或者在这里发布你的客户端代码)。 如果没有,请尝试不同的浏览器。


关于你的disconnect事件。

你有一个io.sockets.on("connection", function (client) { ... })事件处理程序,当一个新的连接build立一个会话,为连接创build,并存储在客户端variables。

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

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

而且,正如你在Exposed Events – Socket.io中看到的那样 , io.sockets.on只暴露connection事件。

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

以毫秒为单位的时间可能是你到服务器的往返时间或pipe理与客户端连接所花费的时间等等。所以我不会打扰那么多的时间因素。

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

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

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

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

所以在某些情况下,上述情况会导致断开事件不能触发。

可能由于计时,asynchronous,networking质量等原因

两种方式去。

  1. 根据这些约束或者构build应用程序
  2. find一个可以想出一个更坚实的方法来听取on.disconnect,这是作为原来的问题躲过,不涉及被附加到一个特定的套接字客户端。

这就像事件监听器被覆盖,当客户端再次用相同的ID连接。 更一般的断开连接事件监听器会忽略这个事件,但是可能会导致其他问题。

我个人将与选项1,而是创build一个垃圾收集器的各种清理我的本地客户端数组,如果他们断开连接。