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

Posted

技术标签:

【中文标题】使用 Socket.io 检测(客户端)连接断开【英文标题】:Detect (client) connection drop with Socket.io 【发布时间】:2015-11-21 11:16:10 【问题描述】:

我正在尝试使用 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 的设备模式伪造连接断开。

【问题讨论】:

文档说您应该在客户端获取其中一些事件。您能否向我们展示您的代码以及您是如何触发连接断开的? 我更新了问题 我想看看socket 是什么。你从哪里得到的? 对不起,在一个模块中我有 core.socket = io.connect();并通过 getSocket 函数将其提供给其他人 还有,你是怎么断开连接的? 【参考方案1】:

事情是这样的:没有可靠的方法来检测连接是否失效。特别是在随机网络故障等极端事件下。欢迎来到网络的恐怖!这是因为the two generals' problem。

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

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

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

您可能还想阅读以下内容:TCP Socket no connection timeout

【讨论】:

以上是关于使用 Socket.io 检测(客户端)连接断开的主要内容,如果未能解决你的问题,请参考以下文章

如何检测Socket IO中的重新连接事件

如何检测 socket.io 上的断开连接?

Socket.io - 客户端断开连接后手动重新连接

socket.io 在空闲时断开客户端的连接

在 NestJS 中连接后,Socket.io 客户端正在断开连接

socket.io 服务器在注册客户端断开连接时非常延迟