检测(客户端)连接断开与 Socket.io

Detect (client) connection drop with Socket.io

提问人:Luca De Nardi 提问时间:8/27/2015 最后编辑:Luca De Nardi 更新时间:12/21/2020 访问量:811

问:

我正在尝试使用 Socket.io(带有 NodeJS 和 AngularJS)来检测客户端何时因连接中断而断开连接。

我试过捕捉socket.on

  • disconnect
  • connect_error
  • reconnect_attempt
  • reconnecting

但看起来他们没有在客户端被解雇。 我做错了什么?

由于连接中断是客户端问题,我希望我应该能够在客户端检测到它,但也许我错了。

有人可以帮我吗?谢谢!


**编辑:** 这是我正在使用的代码
socket.io.timeout(1000);
console.log(socket);
socket.on("open", function(){
    console.log("Connected");
});
socket.on("reconnect_attempt", function(){
    console.log("Attempt");
});
socket.on("reconnecting", function(){
    console.log("Reconnecting");
});
socket.on("disconnect", function(){
    $log.error("Client disconnected");
});

我正在通过 Chrome 的设备模式伪造连接。

AngularJS node.js 客户端 socket.io 套接字

评论

0赞 jfriend00 8/27/2015
该文档说您应该在客户端获取其中一些事件。您能向我们展示您的代码以及您如何触发连接断开吗?
0赞 Luca De Nardi 8/27/2015
我更新了问题
0赞 jfriend00 8/27/2015
我想看看是什么。你从哪里得到的?socket
0赞 Luca De Nardi 8/27/2015
哦,对不起,在一个模块中,我有 core.socket = io.connect();通过 getSocket 函数,我将其提供给其他人
0赞 jfriend00 8/27/2015
而且,您如何使连接断开?

答:

0赞 freakish 12/21/2020 #1

事情是这样的:没有可靠的方法来检测连接是否已死。尤其是在随机网络故障等极端事件下。欢迎来到网络的恐怖!这是因为两位将军的问题

但我们可以近似!强制每个对等体定期发送 ping、读取 pong 和设置超时。并发出您自己的“断开连接,因为 X 秒内没有活动”事件。如有必要,可以在客户端和服务器端完成此操作(尽管在服务器端这更简单:只需定期删除非活动套接字即可)。

自从我断开电缆以来,我已经能够在 25 分钟后捕捉到这些事件

这似乎是测试计算机上的内部 TCP 超时。请注意,断开电缆与断开连接不同。毕竟,您可以重新插入它,一切可能正常工作,就像什么都没发生一样。这很重要,因为您不想对每个零星的(但无关紧要的)网络问题做出反应。

您可能还想阅读以下内容: TCP套接字无连接超时