如何清除WebSocket缓冲区?

6
似乎当websocket断开连接时,它会缓存消息,并在重新连接后立即发送。
我可以看到websocket的“bufferedAmount”正在增加,但是它是只读的。
是否有任何方法可以重置缓冲区,以便在断开连接时发送的消息不会自动发送?

你是否在使用 socket.io 而不是普通的 webSocket? - jfriend00
1个回答

7

我认为你需要的方法是确保readyState属性等于1:

if(ws.readyState == 1)
   ws.send("hi!");

这将防止Websocket断开连接时出现缓冲。
您还可以包装原始函数以强制执行此行为,而不更改其他代码:
ws._original_send_func = ws.send;
ws.send = function(data) {
   if(this.readyState == 1)
     this._original_send_func(data);
   }.bind(ws);

请注意,这可能是一个特定于浏览器的问题。我在Safari上测试过,但不知道为什么Safari在Websocket断开连接后会缓冲数据。
请注意:我所知道的没有“重新连接”API。浏览器使用新的WebSocket对象进行重新连接。
失去连接后,缓冲的数据不会消失,因为它与特定的(现在已过时的)WebSocket对象相关联。
整个WebSocket对象应该被删除(以及其缓冲区),或被垃圾收集器收集(确保删除任何对该对象的现有引用),否则数据将继续存在于内存中。

感谢您的回答。我决定关闭连接并垃圾回收原始WebSocket。 - emil
嗨,我尝试了我们的代码,它出现了一个错误“code = 1000(OK),reason = Deliberate disconnection”。谢谢回答。 - Please help me

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