【问题标题】:WebSockets not closing on IE if closing handshake is never made如果从不关闭握手,WebSockets 不会在 IE 上关闭
【发布时间】: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] 内进行请求的原因。

问题:

  1. 有什么方法可以重置 WebSocket 的数量吗? 在浏览器中使用 JavaScript 连接到端点?
  2. 有没有办法在不彻底关闭连接的情况下立即断开 WebSocket 与端点的连接?
  3. 是否只有这样才能让其工作以通知托管其端点的人进行一些更改,以便他们确实发回关闭帧?
  4. 有什么我误解了或者我可以尝试让它工作的地方吗?

如果有人想了解更多关于 WebSocket 协议的信息,这里(在我看来)是很好的文档[link1][link2]

更新:

只有在 IE 上刷新 Web 应用程序,WebSocket 才不会被破坏
如果您在 Web 应用程序的页面之间导航,则会创建一个新的 WebSocket,但最后一个 WebSocket 将被销毁。

【问题讨论】:

  • 您找到解决问题的方法了吗?
  • @MikhailChibel 我还没有找到替代解决方案。我认为最好的方法是通知那些创建了 WebSocket 服务器的人,他们应该处理关闭事件并在请求关闭事件时发回一个关闭帧。通过这种方式,WebSocket 连接将更快地关闭,并且不会有任何 Websockets 连接在等待超时错误发生。
  • @Deckerz 实际上没有,我没有。您能否提供有关如何执行此操作的示例或链接?我已经通过联系制作 WebSocket 服务器的人解决了我的问题,他们没有响应关闭消息并且他们已经解决了问题。
  • 您应该考虑是否要支持过时的浏览器。

标签: javascript internet-explorer websocket network-protocols handshake


【解决方案1】:

如果这只是一个边缘情况问题,那么使用 http 后备可能是您唯一的选择。我猜你已经为阻止套接字连接的代理服务器这样做了。

【讨论】:

  • 我确实理解使用后备 http 连接进行 web-socket 连接的概念。如果您可以合作,您打算如何关闭 web-socket 连接(从后备)整个页面都被销毁了
  • 如果这种情况发生的不多,我会让它超时并同时使用回退。每分钟重试一次连接,看看何时可以升级回使用 websocket。
【解决方案2】:

只有 1 个想法需要验证(未确认)。很遗憾,无权访问 IE 进行验证。

应用程序可能会在 WebWorker/iFrame 中打开 websocket 连接。页面刷新时会删除“websocket连接范围”,释放连接


解释

来自问题正文的内容:

只有通过刷新 IE 上的 web 应用程序,WebSockets 才不会被破坏。如果您在 Web 应用程序的页面之间导航,则会创建一个新的 WebSocket,但最后一个 WebSocket 将被销毁。

表示当页面刷新时 Websocket 连接不会被破坏。在正常导航期间,一切正常。

因此,如果 websocket 连接在页面重新加载期间将被删除的其他范围内打开,那么希望连接将被破坏。

【讨论】:

猜你喜欢
  • 2020-05-07
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 2015-12-18
  • 2020-10-29
  • 2023-03-07
相关资源
最近更新 更多