如果服务器崩溃,Websocket onclose/onerror 事件不会触发

Posted

技术标签:

【中文标题】如果服务器崩溃,Websocket onclose/onerror 事件不会触发【英文标题】:Websocket onclose/onerror events does not fire if server crashes 【发布时间】:2010-11-03 16:27:57 【问题描述】:

我在 Firefox 4 和 Chrome 7 中观察到以下行为:

如果运行 websocket 守护程序的服务器崩溃、重新启动、失去网络连接等,则不会在客户端触发“onclose”或“onerror”事件。我希望当连接因任何原因中断时会触发其中一个事件。

如果守护程序首先干净地关闭,则触发“onclose”事件(如预期的那样)。

为什么当守护进程没有正常关闭时,客户端会认为 websocket 连接是打开的?

我想依靠预期的行为来通知用户服务器已不可用或客户端的互联网连接已中断。

【问题讨论】:

【参考方案1】:

TCP is like that。最新的 WebSockets 标准草案 (v76) 具有 clean shutdown message 机制。但如果没有它(或者如果它没有机会被发送),您将依赖正常的 TCP 套接字清理,这需要几分钟(或几小时)。

我建议向服务器添加某种信号处理程序/退出陷阱,以便在服务器被杀死/关闭时,向所有连接的客户端发送干净的关闭消息。

您还可以在您的应用程序中添加心跳机制 (ala TCP keep alive) 以检测对方何时离开。

【讨论】:

谢谢。向我的应用程序添加心跳可能是最简单的解决方案。

以上是关于如果服务器崩溃,Websocket onclose/onerror 事件不会触发的主要内容,如果未能解决你的问题,请参考以下文章

Springboot整合Websocket遇到的坑

Safari 扩展:WebSocket 连接失败调用 onclose 而不是 onerror 并且没有异常

WebSocket:调用 close() 不会触发 onclose 处理程序?

Websocket:是不是可以从程序中知道调用 onClose 的原因是啥

nodejs websocket检测断开连接的套接字

初探和实现websocket心跳重连