javascript - 当客户端从网络断开时,Chrome - Linux 中 websocket 的 onclose 未触发
我在服务器端使用 Java 实现了 websocket。在客户端,我创建了 websocket 对象,并且我为所有事件(包括 onClose)编写了自己的函数。我测试了重连……在 Windows 上的 Chrome 26 和 Mozilla 中测试了 websocket。
在 Windows 中,当我拔掉网线时,Chrome 会触发 onclose 事件(即 onclose 触发,closecode 为 1006 [异常关闭],如 https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent 所述),但在 Linux 中 Chrome 不会触发任何事件。
请指出我犯了什么错误。
我确切的问题是,为什么在 Windows 中,当网络断开时,Chrome 会触发 onclose,但在 Linux 中则不会触发。
答案#1
这些应用程序可能不会注意到 TCP 连接中断。超时用于检测失败的 TCP 连接,我认为默认超时时间相当长。
当你尝试发送数据时,浏览器/操作系统应该会注意到连接已经中断。拔掉网络电缆后尝试发送一些数据,看看是否会触发该事件。
另外,你等信号等了多久?也许连接只是有一个很长的 TCP 超时。
如果你仍然收不到关闭事件,很可能是实现上的问题。如果你绝对需要知道连接何时断开,可以自己实现一个带有超时的 ping 机制。我相信 websocket 协议定义了自己的 ping 协议,也许可以研究一下那个。
此外,针对 Chrome 似乎已经有一个相关的问题报告。也许这会对你有帮助。