问题 如何检测用户的连接丢失或他关闭Nodejs socket.io中的浏览器窗口


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

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

仅当用户断开连接时才会触发此socket.io事件。

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

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


12473
2018-04-30 06:23


起源



答案:


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

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

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

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

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


15
2018-04-30 07:34



好吧......我明白了,'断开'事件有效,但是在10-15秒之后,所以起初我认为它永远不会发生......我的坏。 - TaLha Khan
如何获取断开连接的用户session.id ..? - TaLha Khan
断开连接用户session.id解释 stackoverflow.com/questions/8286683/... - TaLha Khan
取决于socket.io正在使用的实际传输方法(websockets,flash,long polling ......),事件将立即触发或在几秒钟后触发。如果您使用的是支持websockets和良好互联网连接的现代浏览器, disconnect 应该在几毫秒内开火! - Salvatorelab
实际上文档还不清楚。首先,上面的链接尚未移至Automattic文档,该文档提供了有关通风口的详细信息。至少没有比socket.io上的一个fins更多的东西。尝试附加到列出的事件无法捕获客户端断开连接。好吧 - gesell


答案:


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

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

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

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

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


15
2018-04-30 07:34



好吧......我明白了,'断开'事件有效,但是在10-15秒之后,所以起初我认为它永远不会发生......我的坏。 - TaLha Khan
如何获取断开连接的用户session.id ..? - TaLha Khan
断开连接用户session.id解释 stackoverflow.com/questions/8286683/... - TaLha Khan
取决于socket.io正在使用的实际传输方法(websockets,flash,long polling ......),事件将立即触发或在几秒钟后触发。如果您使用的是支持websockets和良好互联网连接的现代浏览器, disconnect 应该在几毫秒内开火! - Salvatorelab
实际上文档还不清楚。首先,上面的链接尚未移至Automattic文档,该文档提供了有关通风口的详细信息。至少没有比socket.io上的一个fins更多的东西。尝试附加到列出的事件无法捕获客户端断开连接。好吧 - gesell