我一直在使用 JavaScript 实现 WebSocket,但遇到了以下问题:
当我向网络应用程序连接的端点发送关闭控制帧时,它不会发回关闭控制帧。
这还不错,因为浏览器会在一段时间后关闭 WebSocket 连接。
但需要注意的一些事情是:
浏览器只允许同时连接特定数量的 WebSocket。
刷新 Web 应用程序时,会创建一个新的 WebSocket
这会导致 IE 出现问题:
刷新 Web 应用程序超过 6 次时,无法建立 WebSocket 连接。
如果 WebSocket 没有完全关闭,IE 似乎不会“删除”它们。奇怪的是,网络套接字的数量似乎永远不会因为刷新或只是等待而减少。
只有关闭浏览器窗口或选项卡才能将 WebSocket 数量重置为 0。
我做了一些研究,这就是我发现的: <小时/>
浏览器仅支持同时连接特定数量的 WebSocket。
IE支持6个websocket连接 [link]
Chrome支持255个websocket连接[link] .
当您执行 socket.close()
时,不会触发 socket.onclose()
,而是在端点响应关闭消息时调用它. [link]
IE 等待 15 秒以让端点发送关闭消息 [link] .
Chrome 等待 60 秒以获取响应消息 [抱歉,没有此链接,通过测试发现了这一点]。
如果没有收到响应消息,浏览器将关闭 WebSocket 连接并出现 TimeoutError。
如果我错了,请纠正我:)
<小时/>我尝试使用 unbeforeload
断开与端点的连接,希望浏览器在一段时间后关闭连接,但没有成功。 [link] .
这也可能是 IE 无法在 unbeforeload
函数中执行请求的原因 [link] .
问题:
- 有什么方法可以重置 WebSocket 的数量吗? 使用 JavaScript 在浏览器中连接到端点?
- 有没有办法立即断开 WebSocket 与端点的连接,而无需完全关闭连接?
- 唯一的方法是通知托管端点的人进行一些更改,以便他们发回结束帧吗?
- 有什么我误解的地方或者我可以尝试让它发挥作用的地方吗?
(在我看来)如果有人想了解更多关于 WebSocket 协议(protocol)的内容,这里有很好的文档 [link1] [link2] .
更新:
只有在 IE 上刷新 Web 应用程序,WebSocket 才不会被破坏。
如果您在 Web 应用程序中的页面之间导航,则会创建一个新的 WebSocket,但最后一个 WebSocket 将被销毁。
最佳答案
如果这只是一个边缘情况问题,那么使用 http 回退可能是您唯一的选择。我想您已经对阻止套接字连接的代理服务器执行了此操作。
关于javascript - 如果从未进行关闭握手,WebSockets 不会在 IE 上关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51893524/