Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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 socket.io网络连接故障检测_Javascript_Node.js_Express_Socket.io - Fatal编程技术网

Javascript socket.io网络连接故障检测

Javascript socket.io网络连接故障检测,javascript,node.js,express,socket.io,Javascript,Node.js,Express,Socket.io,每当用户失去对网络的访问时,我都会遇到使用socket.io时错误连接超时的问题。 问题是,当用户失去与网络的连接时,服务器并没有注意到它,而且用户似乎仍然能够触发一些事件。 如何正确断开这两个连接: -从客户端角度看网络故障 -从服务器角度看客户端网络故障 所以基本上我在这里托管了一个应用程序:askit-break-scheduler.herokuapp.com,如果我随后连接应用程序并挂起连接,例如将笔记本电脑置于睡眠模式,一些数据将丢失,我的昵称似乎设置为未定义。你能帮我弄清楚我在这里遗

每当用户失去对网络的访问时,我都会遇到使用socket.io时错误连接超时的问题。 问题是,当用户失去与网络的连接时,服务器并没有注意到它,而且用户似乎仍然能够触发一些事件。 如何正确断开这两个连接: -从客户端角度看网络故障 -从服务器角度看客户端网络故障


所以基本上我在这里托管了一个应用程序:askit-break-scheduler.herokuapp.com,如果我随后连接应用程序并挂起连接,例如将笔记本电脑置于睡眠模式,一些数据将丢失,我的昵称似乎设置为未定义。你能帮我弄清楚我在这里遗漏了什么吗?代码可以在这里找到:github.com/Hoopoe99PL/break-tracker

我在节点中按如下方式管理http连接:

app.get(“/”,(req,res)=>{
fs.readFile(uu dirname+'/src/index.html',
功能(错误、数据){
如果(错误){
书面记录(500);
返回res.end('Error loading index.html');
}
书面记录(200);
res.end(数据);
});
});
应用程序使用(express.static(uu dirname+“/src”);
然后管理IO连接和断开连接事件:

io.on(“连接”(socket)=>{
//这里还有其他代码
socket.on('disconnect',()=>{
//删除所有会话数据,清除数组和映射中与该套接字相关的所有条目
取消用户状态(socket.id);
users.delete(socket.id);
io.emit('u-users-list',Array.from(users));
clearInterval(interval.get(socket.id));
删除(socket.id);
});
});
我的问题是,每当用户暂停网络连接,然后再次尝试重新连接时,似乎会丢失一些数据,例如,用户名设置为未定义

我查看了服务器的日志,在代码前面将新连接的套接字id打印到控制台时,似乎没有任何关于新连接的输出

我正在考虑以某种方式强迫用户重新连接到服务器,因为这一切看起来就像当用户失去网络连接,然后再次获得它时,他立即连接到应用程序,但在应用程序开始时启动的验证过程,当在web浏览器中输入url时,这里似乎不会触发

我想需要任何客户端处理程序


编辑:下面评论中提供的客户端处理程序可能是一个答案,稍后将进行测试。

如果您的客户端存在连接问题,那么socket.io将已经尝试检测这些连接问题并重新连接。除此之外,您所能做的最好的事情就是在UI中显示存在连接问题的反馈,一旦您失去连接,您甚至可能会禁用控件,或者在它们单击控件时出现错误,以通知用户您失去了连接,无法执行操作

您可以收听的相关客户端事件包括:

error
connect_error
connect_timeout
reconnect
reconnecting
reconnect_error
reconnect_failed

你可以在书中读到这些事件的确切含义。其中一些事件表示您已失去连接,其中一些事件是尝试重新建立连接的过程中的步骤。

如果您的客户端存在连接问题,则socket.io将已经尝试检测这些连接问题并重新连接。除此之外,您所能做的最好的事情就是在UI中显示存在连接问题的反馈,一旦您失去连接,您甚至可能会禁用控件,或者在它们单击控件时出现错误,以通知用户您失去了连接,无法执行操作

您可以收听的相关客户端事件包括:

error
connect_error
connect_timeout
reconnect
reconnecting
reconnect_error
reconnect_failed

你可以在书中读到这些事件的确切含义。其中一些事件意味着您失去了连接,其中一些事件是尝试重新建立连接的过程中的步骤。

请确认,因为您说您已经搜索了很多次:您是否检查了上的文档和问题列表?那么,socket.io使用心跳来尝试检测连接何时断开,当断开连接时,它会关闭套接字并尝试重新连接。如果重新连接成功,它将恢复中断的位置,并且不应丢失任何消息(当连接出现问题时,消息将在内部缓存)。如果可以恢复连接,这一切都应该是透明的。socket.io有一些配置参数,这些参数决定它尝试重新连接的时间和频率,如果在这段时间内连接失败,它将放弃并宣布错误。因此,考虑到所有这些,我们还不清楚您正在观察的行为以及您想对此做些什么?第一件事是确保你正在监听客户端套接字上所有可能的错误,这样你就可以知道诸如重新连接失败之类的事情。因此,基本上我在这里托管了一个应用程序:,如果我随后连接应用程序并挂起连接,例如将笔记本电脑置于睡眠模式,一些数据丢失,我的昵称似乎被设置为未定义。你能帮我弄清楚我在这里遗漏了什么吗?代码可在此处找到:请编辑您的问题以包含这些特定的详细信息,然后将相关的socket.io连接和错误处理代码添加到您的问题中。如果问题是服务器上的昵称设置为
未定义
,则也发布相关的服务器代码。为了在这里吸引帮助,您需要“设置表格”,通过尽可能具体地描述问题,然后(在您的问题中)显示相关代码来吸引人们帮助您。这就是你在这里吸引快速准确答案的原因。请确认一下,鉴于你说你一直在搜索:你是否检查了上的文档和问题列表?因此,socket.io使用心跳来尝试检测连接何时断开以及何时断开,