当前位置: 首页 > 面试题库 >

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

陈哲
2023-03-14
问题内容

我在Node.js和Socket.io上有一个聊天应用程序,用户可以通过按钮进行连接和断开连接…我有一个在线用户列表,借助我定义的事件触发,可以很好地管理这些用户。

但是问题是我无法检测到用户是否在没有手动断开连接(通过断开连接按钮)的情况下断开了连接或关闭了浏览器窗口…

仅当用户断开连接时才触发该socket.io事件,而不会在断开连接时触发。

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

我希望有一种非常好的机制来关注用户,以便更新我的在线用户列表。


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 假设客户端在RC服务器上启动了selenium会话,但是在会话中间,客户端“消失了”。浏览器将保持打开状态,最终,在经过足够的此类丢弃会话后,将有足够的“孤立”浏览器来降低计算机的速度。 如何确定那些浏览器已关闭? 为什么协议中没有“保持活动”的部分来确保客户端仍在响应,如果不能终止会话,该怎么办? 问题答案: 任何浏览器实例都有一个可以存储的session_id。Python示例:

  • 问题内容: 有谁知道我可以使用JavaScript检查浏览器窗口何时关闭并弹出确认对话框询问用户是否确认退出浏览器还是改变主意的任何方式? 问题答案: window.onbeforeunload = function (e) { var e = e || window.event;

  • 问题内容: 您好,我要在关闭选项卡(不是浏览器)事件中查找信息,如果Java中有一个applet信息。我想知道是否有一个事件或一种检查该方法的方法。我只想捕获事件并创建一个小弹出框,说明您的会话将过期或类似的内容。使用Java或Javascript完全有可能吗? 更新:好的,你们向我指出的信息使我能够获得足够简单的JavaScript信息。现在它在IE,Chrome和Firefox中可以正常工作,

  • 问题内容: 是否有跨浏览器的JavaScript / jQuery代码来检测浏览器或浏览器选项卡是否已关闭,但不是由于单击链接而导致的? 问题答案: 如果我正确地理解了您,您想知道标签/窗口何时有效关闭。好吧,AFAIK 检测事件的唯一方法是&事件。 不幸的是(或幸运的是?),当您通过或浏览器的后退按钮离开网站时,也会触发这些事件。因此,这是我能给出的最佳答案,我认为您无法从本机检测Java 脚本

  • 问题内容: 有没有办法查看所有浏览器窗口是否关闭?我看到,如果您在WebDriver上调用driver.quit()或driver.close(),则sessionId将变为null。有没有办法检查? 我不想调用已关闭或退出的驱动程序,因为它会引发WebDriverException。因此,我想在继续之前检查浏览器的状态。 问题答案: 刚设定 每次您退出浏览器并检查 要么 或收到NullPoint

  • 问题内容: 我尝试使用以下代码在关闭浏览器窗口时收到警报: 它可以工作,但是如果页面包含一个超链接,则单击该超链接会引发相同的警报。仅在关闭浏览器窗口时才需要显示警报,而在单击超链接时则不需要。 问题答案: 保持您的代码不变,并使用jQuery处理链接: