如果从未进行关闭握手,WebSockets将不会在IE上关闭

时间:2018-08-17 10:35:43

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

所以我一直在用JavaScript实现一个websocket,而我遇到了一个问题:
与我的Web应用程序连接的终结点在发送封闭控制框时不会发回。

这还不错,因为浏览器会在一段时间后关闭websocket连接。

但是要注意的几件事是

  • 浏览器仅允许同时连接一定数量的websocket。

  • 刷新Web应用程序时,会创建一个新的Websocket

这会导致IE上的问题:
刷新网络应用超过6次时,无法建立网络套接字连接。

如果未完全关闭,则似乎IE不会“删除” websocket。奇怪的是,Web套接字的数量似乎从未因刷新或等待而减少。

仅通过关闭浏览器窗口或选项卡,将WebSocket的数量重置为0。


我做了一些研究,这就是我发现的东西:


浏览器仅支持同时连接一定数量的Websocket。

IE支持连接6个网络套接字[link]

Chrome支持连接255个Websocket [link]

socket.onclose()不会触发socket.close(),当端点响应并发出关闭消息时会调用它。 [link]

IE等待15秒,以使端点发送关闭消息[link]

Chrome等待60秒钟,直到出现响应消息[抱歉,对此没有链接,通过测试发现了此消息。]

如果未收到任何响应消息,则浏览器将关闭websocket连接,并应发生TimeoutError。

如果我写错了,请纠正我:)


我尝试使用unbeforeload与端点断开连接,希望浏览器过一会儿就关闭连接,但是没有运气。 [link]
也可能是IE无法在unbeforeload函数[link]内部进行请求的原因。

问题:

  1. 是否有任何方法可以重置Websocket的数量 在浏览器中使用JavaScript连接到端点?
  2. 是否有一种方法可以在不干净关闭连接的情况下立即从端点断开Websocket?
  3. 使这一功能起作用的唯一方法是通知托管其端点的主机进行一些更改,以便他们确实发送回封闭帧吗?
  4. 有没有我误解的东西,或者我可以尝试使它起作用?

(在我看来)如果有人想详细了解[link1] [link2],这里是有关websocket协议的很好的文档。

更新:

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

2 个答案:

答案 0 :(得分:1)

如果这只是一个极端的问题,那么使用http备用广告可能是您唯一的选择。我想您已经对阻止套接字连接的代理服务器执行了此操作。

答案 1 :(得分:0)

只有1个想法可以验证(未确认)。不幸的是,没有访问IE的权限。

应用程序可以在WebWorker / iFrame中打开websocket连接。在页面刷新期间,“ websocket连接范围”将被删除,并且连接被释放


EXPLANATION

问题正文中的内容:

  

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

说页面刷新时,Websocket连接不会仅破坏。在正常导航期间,一切正常。

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