16

我在 Node.js 和 Socket.io 上有一个聊天应用程序,用户可以通过一个按钮连接和断开连接......我有一个在线用户列表,在我定义的用户触发事件的帮助下可以完美管理。

但问题是我无法检测到用户是否丢失了连接或关闭了浏览器窗口而不手动断开连接(通过断开按钮)......

这个 socket.io 事件仅在用户断开连接时触发,而不是在他失去连接时触发。

socket.on('disconnect',function(){
   console.log('user disconnected');  });

我想要一些非常好的机制来关注用户,以便更新我的在线用户列表。

4

1 回答 1

18

有什么区别?关闭窗口,切断以太网线......对于服务器来说都是一样的:连接结束。

阅读 socket.io 文档:https ://github.com/LearnBoost/socket.io/wiki/Exposed-events

socket.on('disconnect', function() {}) - 当客户端-服务器连接关闭时,在所有情况下都会触发断开事件。它会在通缉、不需要、移动、非移动、客户端和服务器断开连接时触发。

您不应该依赖您的按钮,因为人们可以在不使用该按钮的情况下断开连接。使用 disconnect 事件,一旦套接字断开连接(一个套接字,而不是用户,因为 Node 只知道套接字),您将必须找出谁是该套接字的“所有者”并将他标记为“断开连接”。或者更好的是,等待几秒钟,然后将他标记为离线。为什么?因为即使用户只是重新加载页面或导航到另一个页面,断开连接事件也会触发。因此,如果您等待几秒钟,用户将再次在线。

我也遇到了这个问题,我最终创建了一个“观察者”,它每 X 秒运行一次,并在用户不拥有任何套接字或似乎不在时(长时间没有活动)将用户标记为离线。

于 2013-04-30T07:34:07.957 回答