我的Web应用程序连接的终端在我发送关闭控制帧时没有返回关闭控制帧。
这并不是太糟糕,因为浏览器会在一段时间后关闭WebSocket连接。
但需要注意以下几点:
浏览器只允许同时连接特定数量的WebSocket。
刷新Web应用程序时会创建新的WebSocket
这导致在IE上出现问题:
刷新Web应用程序超过6次时,无法建立WebSocket连接。
似乎IE如果它们没有被干净地关闭,则不会“删除”WebSockets。奇怪的是,WebSocket的数量似乎从未通过刷新或等待减少。
只有关闭浏览器窗口或标签才能将WebSocket数重置为0。
我进行了一些调查,这是我发现的:
浏览器只支持同时连接特定数量的WebSocket。
IE支持连接6个WebSockets [链接]
Chrome支持同时连接255个WebSocket。[链接]
当端点响应关闭消息时,socket.onclose()不会被触发,而不是在执行socket.close()时被调用。[链接]
IE等待15秒钟以便端点发送关闭消息。[链接].
Chrome等待60秒以便响应消息。[很抱歉,没有相关链接,这是通过测试发现的]
如果未接收到响应消息,则浏览器将关闭WebSocket连接并应该出现TimeoutError。
如果我有错误,请纠正我 :)
我曾尝试使用unbeforeload
从端点断开连接,希望浏览器能在一段时间后关闭连接,但没有成功。[链接]
这也可能是导致IE不能在unbeforeload
函数中进行请求的原因。[链接].
问题:
- 是否有办法使用JavaScript重置连接到终端点的浏览器中的WebSockets数目?
- 有没有一种方法可以立即从终端点断开WebSocket而不关闭连接?
- 唯一解决此问题的方法是告知托管其终结点的人进行更改,以便他们发送一个关闭帧回来吗?
- 我有什么误解或者可以尝试让这个问题解决的方法?
如果有人想了解更多关于 WebSocket 协议的信息,以下是(在我看来)好的文档 [link1] [link2].
更新:
只有在IE上刷新Web应用程序时,WebSockets才不会被销毁。如果在Web应用程序中导航到其他页面,将创建新的WebSocket,但最后一个WebSocket将被销毁。