我在 Firefox 4 和 Chrome 7 中观察到以下行为:
如果运行 websocket 守护程序的服务器崩溃、重新启动、失去网络连接等,则不会在客户端触发 'onclose' 或 'onerror' 事件。我希望在连接因任何原因中断时触发其中一个事件。
但是,如果守护程序首先干净地关闭,则会触发“onclose”事件(如预期的那样)。
为什么当守护进程没有正常关闭时,客户端认为 websocket 连接是打开的?
我想依靠预期的行为来通知用户服务器已不可用或客户端的互联网连接已中断。
最佳答案
TCP is like that .最新的 WebSockets 标准草案 (v76) 有一个 clean shutdown message机制。但如果没有它(或者如果它没有机会被发送),您将依赖正常的 TCP 套接字清理,这需要几分钟(或几小时)。
我建议向服务器添加某种信号处理程序/退出陷阱,以便在服务器被终止/关闭时,向所有连接的客户端发送干净的关闭消息。
您还可以向您的应用程序添加心跳机制(ala TCP keep alive)以检测另一端何时消失。
关于如果服务器崩溃,Websocket onclose/onerror 事件不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4089235/