使用 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 检测(客户端)连接断开的主要内容,如果未能解决你的问题,请参考以下文章