2014-03-06 53 views
0

目前我正在使用node.js服务器,它具有TCP套接字连接(使用socket.io)使用这个我正在通过浏览器显示实时数据。通过套接字检测互联网断开

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

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

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

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

+0

这通常是不可能的。当另一个国家的某个路由器崩溃时,你的应用怎么会突然被通知?网络/协议将尝试重新路由您的数据,这需要时间。 –

+0

@MartinJames这是可能的。当我关闭/刷新浏览器时,它正在触发“断开连接”事件; *而当我尝试断开网线时,它在60秒后触发相同的断开事件*所以我的问题是**延迟**,这是由于浏览器/节点和socket.io之间的心跳脉冲,这是清楚地解释在下面的答案。希望你有我的观点:) – Praveen

回答

3

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

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

现在,服务器将发出心跳每5秒,如果客户没有在10秒内接收到心跳,断开事件将被解雇。但请记住,心跳间隔应小于心跳超时。希望这会起作用!

+0

1000+感谢您的解释:)在这里确实减少* heartBeat *间隔在我的应用程序的任何部分有任何不利影响? – Praveen

+1

是的,你可以这样说,因为服务器在这种情况下会更忙,但这取决于你的硬件配置。 –