【问题标题】:Socket IO detect when client has lost connectionSocket IO 检测客户端何时失去连接
【发布时间】:2012-02-29 06:15:52
【问题描述】:

我需要能够检测用户何时失去与套接字的连接,当我关闭笔记本电脑时似乎没有调用 socket.on("disconnect"),因此它不会运行需要的 ajax 调用运行以更新数据库以将用户标记为脱机。如何检查连接是否已关闭或其他?

【问题讨论】:

  • 我建议有一个监听器,或者一个“心跳”来检查客户端是否有来自服务器的响应。这就是我所做的。
  • 我在以前的网站版本中这样做了,尽管在给定时间有足够多的用户,但就请求数量而言,这似乎只是服务器上的一种过载,虽然它可能是最好的,也是唯一的选择。
  • socket.io 使用心跳,所以我确定这是可行的
  • 好吧,当我发现它确实检测到它断开连接时,它会触发服务器文件中的断开连接,但是它无法将断开连接发送到它获取指令的页面出于某种原因触发 ajax 调用以更新数据库,所以我需要想办法从服务器文件更新数据库,我不确定如何。
  • 您可以执行回调或自定义事件发射器 + 订阅者。

标签: javascript node.js socket.io


【解决方案1】:

正如这里提到的https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO,Socket.IO 有它自己的心跳实现。 但默认值是 25 秒的间隔和 60 秒的连接丢失阈值。

所以我的建议是:按照您对测试的期望设置默认值。否则你可能会错过阈值。

例子:

socket.set("heartbeat timeout", 10);
socket.set("heartbeat interval", 5);

【讨论】:

  • 这应该是公认的答案。它在第一次工作...在我的情况下,超时和间隔以毫秒为单位设置,所以 10000 而不是 10...非常感谢!
【解决方案2】:

我们也遇到过这个问题,如上所述使用我们自己的心跳计时器。

例如,服务器将每 5 秒发出一次心跳(我们简单地发送服务器时间)。客户端有 11 秒的超时时间,因此它有 2 次机会捕捉到心跳。如果它收到心跳,我们将重置计时器。如果我们错过了两个心跳,超时功能就会运行,你可以在那里做任何你想做的事情。

相当简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2021-09-14
    • 2022-09-27
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多