【问题标题】:Detect internet disconnection via socket通过套接字检测互联网断开连接
【发布时间】:2014-04-08 16:32:34
【问题描述】:

目前我正在使用具有 TCP 套接字连接(使用 socket.io)的 node.js 服务器,我正在通过浏览器显示实时数据。

考虑一个场景,我已经登录到我的应用程序并且所有实时都通过网络浏览器显示。现在网络突然断开了。那时,我想在客户端套接字发出 disconnect 事件时显示一条消息“已过期”。

socket.on('disconnect', function () {
            console.log("Disconnected from the server");
            alert("disconnect");
        });

现在我的问题是:上面的disconnect 事件在 60 秒后发出;在用户尝试更新之间,它不会起作用,这会给我们留下不好的印象。

如何克服这种情况以及如何在网络断开时突然发出disconnect事件?

【问题讨论】:

  • 这通常是不可能的。当另一个国家的某些路由器崩溃时,如何“突然”通知您的应用程序?网络/协议将尝试重新路由您的数据,这需要时间。
  • @MartinJames 这是可能的。当我关闭/刷新浏览器时,它已经触发了“断开连接”事件; 而当我尝试断开网络电缆时,它会在 60 秒后触发相同的断开事件。 所以我的问题是 延迟,这是由于浏览器/节点之间的心跳脉冲和 socket.io 在下面的答案中有清楚的解释。希望你明白我的意思:)

标签: javascript node.js sockets socket.io


【解决方案1】:

您必须了解heartbeat intervalheartbeat timeout。较早的时间是服务器每 25 秒发出 heartbeat 的时间(默认情况下)。后来是服务器超时,以将该特定客户端保留在内存中。如果客户端在heartbeat timeout(默认为 60 秒)内收到心跳,它会告诉服务器我还活着。如果客户端在此超时时间内未收到来自服务器的心跳,则服务器将该客户端刷新出内存,并在客户端自动触发 disconnect 事件。当客户端连接到服务器时设置此超时。因此,您可以像这样在 Node.js 服务器中设置这些属性:

var socket = require('socket.io').listen(80,{
  'heartbeat interval': 5,
  'heartbeat timeout' : 10
});

现在服务器将每 5 秒发出一次心跳,如果客户端在 10 秒内没有收到心跳,则会触发断开连接事件。但请记住,心跳间隔应该小于心跳超时。希望这会奏效!

【讨论】:

  • 1000+ 感谢您的解释 :) 这里减少 heartBeat 间隔对我的应用程序的任何部分有任何不利影响吗?
  • 是的,你可以这么说,因为在这种情况下服务器会更忙,但这取决于你的硬件配置。
【解决方案2】:

这是我的解决方案

var io = require('socket.io')
  .listen(server, {'pingTimeout':4000, 'pingInterval':2000});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多