WebSockets在IE上如果没有进行关闭握手就不会关闭。

41
我一直在使用JavaScript实现WebSocket,但是遇到了一个问题:
我的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函数中进行请求的原因。[链接].

问题:

  1. 是否有办法使用JavaScript重置连接到终端点的浏览器中的WebSockets数目?
  2. 有没有一种方法可以立即从终端点断开WebSocket而不关闭连接?
  3. 唯一解决此问题的方法是告知托管其终结点的人进行更改,以便他们发送一个关闭帧回来吗?
  4. 我有什么误解或者可以尝试让这个问题解决的方法?

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

更新:

只有在IE上刷新Web应用程序时,WebSockets才不会被销毁。如果在Web应用程序中导航到其他页面,将创建新的WebSocket,但最后一个WebSocket将被销毁。


你找到解决问题的方法了吗? - Mikhail Chibel
1
@MikhailChibel 我没有找到其他的解决方案。我认为最好的方法是通知创建WebSocket服务器的人应该处理关闭事件,并在请求关闭时发送一个关闭帧。这样,WebSocket连接将更快地关闭,也不会有WebSocket连接挂起等待超时错误发生。 - OuuGiii
1
@Deckerz 实际上没有,你能提供一个例子或者一个链接来说明如何做到这一点吗?我通过联系制作WebSocket服务器的人解决了我的问题,他们不响应关闭消息并已经修复了这个问题。 - OuuGiii
2
这个问题与以下相关:https://dev59.com/L2445IYBdhLWcg3wia2V - filipe
4
你应该考虑是否要支持一个过时的浏览器。 - Vincent Hoch-Drei
显示剩余3条评论
2个回答

1
如果只是一个边缘案例问题,那么使用http回退可能是您唯一的选择。我想你已经为阻止套接字连接的代理服务器执行此操作。

我确实理解使用备用http连接来进行web-socket连接的概念,如果您可以,请协作说明当整个页面被销毁时,如何关闭备用的web-socket连接。 - ymz
如果这种情况不经常发生,我会让它超时并在此期间使用备用方案。每分钟重试一次连接,以便确定何时可以升级回使用WebSocket。 - David Bradshaw

0

只有一个想法需要验证(未经确认)。不幸的是,无法访问IE进行验证。

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


解释

这段内容来自问题主体:

只有在IE上刷新Web应用程序时,WebSockets才不会被销毁。如果在Web应用程序中导航到其他页面,则将创建一个新的WebSocket,但是上一个WebSocket将被销毁。

这意味着当页面刷新时,Websocket连接才不会被销毁,正常导航时一切都正常。

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


1
好的... 这听起来合理,那么 https://www.browserling.com/internet-explorer-testing 如何?您可以上传您的解决方案并在旧版 IE 上进行测试(远程)。 - ymz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接