【发布时间】:2019-01-24 09:16:20
【问题描述】:
我一直在用 JavaScript 实现一个 WebSocket,但我遇到了一个问题:
我的 Web 应用程序连接到的端点在我发送它时没有发回关闭控制帧一。
这还不错,因为浏览器会在一段时间后关闭 WebSocket 连接。
但有几点需要注意:
-
浏览器只允许同时连接特定数量的 WebSocket。
-
刷新 web 应用程序时,会创建一个新的 WebSocket
这导致IE上的问题:
Web应用程序刷新超过6次时,无法建立WebSocket连接。
如果 WebSocket 没有完全关闭,IE 似乎不会“删除”它们。奇怪的是,Web 套接字的数量似乎从未因刷新或仅因等待而减少。
仅通过关闭浏览器窗口,或选项卡将 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 协议的信息,这里(在我看来)是很好的文档[link1][link2]。
更新:
只有在 IE 上刷新 Web 应用程序,WebSocket 才不会被破坏。
如果您在 Web 应用程序的页面之间导航,则会创建一个新的 WebSocket,但最后一个 WebSocket 将被销毁。
【问题讨论】:
-
您找到解决问题的方法了吗?
-
@MikhailChibel 我还没有找到替代解决方案。我认为最好的方法是通知那些创建了 WebSocket 服务器的人,他们应该处理关闭事件并在请求关闭事件时发回一个关闭帧。通过这种方式,WebSocket 连接将更快地关闭,并且不会有任何 Websockets 连接在等待超时错误发生。
-
@Deckerz 实际上没有,我没有。您能否提供有关如何执行此操作的示例或链接?我已经通过联系制作 WebSocket 服务器的人解决了我的问题,他们没有响应关闭消息并且他们已经解决了问题。
-
您应该考虑是否要支持过时的浏览器。
标签: javascript internet-explorer websocket network-protocols handshake