Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过套接字检测internet断开连接_Javascript_Node.js_Sockets_Socket.io - Fatal编程技术网

Javascript 通过套接字检测internet断开连接

Javascript 通过套接字检测internet断开连接,javascript,node.js,sockets,socket.io,Javascript,Node.js,Sockets,Socket.io,目前,我使用的是具有TCP套接字连接的node.js服务器(使用socket.io),通过浏览器显示实时数据 考虑一个场景,我已经登录到我的应用程序,所有实时数据都通过web浏览器显示。现在网络突然断开了。此时,我想在客户端套接字发出断开连接事件时显示一条消息,表示“过期” socket.on('disconnect', function () { console.log("Disconnected from the server"); alert

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

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

socket.on('disconnect', function () {
            console.log("Disconnected from the server");
            alert("disconnect");
        });
现在我的问题是:上述
disconnect
事件在60秒后发出;在两者之间,当用户尝试更新时,它将不起作用,这将给我们留下坏印象


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

您必须了解
心跳间隔
心跳超时
。更早的时间是服务器每25秒发出一次心跳(默认情况下)。稍后是服务器将特定客户端保留在内存中的超时时间。如果客户端在<代码>心跳超时(默认为60秒)内接收到心跳,它会告诉服务器我还活着。若客户端在此超时时间内未接收到来自服务器的心跳信号,则服务器会清除该客户端的内存,并在客户端自动触发
disconnect
事件。此超时在客户端连接到服务器时设置。因此,您可以在Node.js服务器中设置以下属性:

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

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

您必须了解
心跳间隔
心跳超时
。更早的时间是服务器每25秒发出一次心跳(默认情况下)。稍后是服务器将特定客户端保留在内存中的超时时间。如果客户端在<代码>心跳超时(默认为60秒)内接收到心跳,它会告诉服务器我还活着。若客户端在此超时时间内未接收到来自服务器的心跳信号,则服务器会清除该客户端的内存,并在客户端自动触发
disconnect
事件。此超时在客户端连接到服务器时设置。因此,您可以在Node.js服务器中设置以下属性:

var socket = require('socket.io').listen(80,{
  'heartbeat interval': 5,
  'heartbeat timeout' : 10
});
现在服务器将每5秒发出一次心跳信号,若客户端在10秒内并没有收到心跳信号,断开连接事件将被触发。但请记住,心跳间隔应该小于心跳超时。希望这能奏效

这是我的解决方案

var io = require('socket.io')
  .listen(server, {'pingTimeout':4000, 'pingInterval':2000});
这是我的解决方案

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

一般来说,这是不可能的。当另一个国家的某个路由器崩溃时,你的应用程序如何“突然”得到通知?网络/协议将尝试重新路由您的数据,这需要时间,这是可能的。当我关闭/刷新浏览器时,它已触发“断开连接”事件;而当我尝试断开网络电缆时,它会在60秒后触发相同的断开事件。所以我的问题是延迟,这是由于浏览器/节点和socket.io之间的心跳脉冲造成的,下面的答案中对此进行了明确的解释。希望你明白我的意思:)总的来说,这是不可能的。当另一个国家的某个路由器崩溃时,你的应用程序如何“突然”得到通知?网络/协议将尝试重新路由您的数据,这需要时间,这是可能的。当我关闭/刷新浏览器时,它已触发“断开连接”事件;而当我尝试断开网络电缆时,它会在60秒后触发相同的断开事件。所以我的问题是延迟,这是由于浏览器/节点和socket.io之间的心跳脉冲造成的,这在下面的答案中有清楚的解释。希望你明白我的意思:)1000+谢谢你的解释:)在我的应用程序中,缩短心跳间隔对任何部分都有负面影响吗?是的,你可以这么说,因为在这种情况下,服务器会更忙,但这取决于您的硬件配置。1000+感谢您的解释:)在这里,缩短心跳间隔对我的应用程序的任何部分都有不利影响吗?是的,您可以这么说,因为在这种情况下,服务器会更忙,但这取决于您的硬件配置。