socket.io 通过 XHR 轮询强制断开连接

Posted

技术标签:

【中文标题】socket.io 通过 XHR 轮询强制断开连接【英文标题】:socket.io force a disconnect over XHR-polling 【发布时间】:2012-08-16 03:37:42 【问题描述】:

我有一个客户端/服务器应用程序,在服务器上使用 nodejs 和 socket.io 作为连接机制。出于与我的应用程序相关的原因,我希望每个浏览器只有一个活动连接,并拒绝来自其他选项卡的所有连接,这些连接可能稍后在会话期间打开。这对 WebSockets 很有效,但是如果浏览器不支持 WebSockets 而使用 XHR 轮询,则永远不会发生断开连接,因此如果用户只是刷新页面,这不会被解释为重新连接(我有延迟重新连接和会话恢复),但作为一个新选项卡,它以连接被拒绝而结束,因为同一选项卡建立的旧连接仍然处于活动状态。

我正在寻找一种在发生刷新时有效地结束来自客户端的连接的方法。我尝试绑定到beforeunload 并在客户端调用socket.disconnect(),并发送类似socket.emit('force-disconnect') 的消息并触发与服务器的断开连接,但没有成功。我在这里错过了什么吗?感谢你的帮助!

我已经阅读了this question 并没有发现它对我的特殊情况有用。

【问题讨论】:

【参考方案1】:

如果您用完了可用的打开文件描述符,您也可能会收到“错误:xhr 轮询错误”。这很可能发生在负载测试期间。

检查当前打开的文件描述符大小:

ulimit -n

把它增加到一个高数:

ulimit -n 1000000

【讨论】:

【参考方案2】:

解决了这个问题,原来是socket.io 0.9.5中引入的bug。如果您遇到此问题,只需将您的服务器和客户端代码都更新为 socket.io > 0.9.9 并将 socket.io 客户端选项 sync disconnect on unload 设置为 true 即可。

选项是这样设置的:

var socket = io.connect('http://yourdomain.com', 'sync disconnect on unload' : true);

【讨论】:

我就是这么做的... 1) npm install socket.io 2)npm install socket.io-client 3) var socket = io.connect('yourdomain.com', 'sync disconnect卸载时': true);在客户端。 Xhr-polling 在 Chrome 浏览器上运行正常。但不是在我的 iPad 上。 嗯,不知道为什么 ipad 的处理方式不同...您是否尝试过禁用所有其他传输以确保它仅通过 XHR 轮询发生,因为这是我们在这里谈论的传输? 非常肯定,传输选项中只有 xhr-polling 我会等待engine.io被合并 @ngzhongcai 有关为什么同步断开在 ios 上不起作用的更多详细信息,请参阅此答案:***.com/a/18064892/69868

以上是关于socket.io 通过 XHR 轮询强制断开连接的主要内容,如果未能解决你的问题,请参考以下文章

socket.io xhr 在慢速连接上发布错误(3G 移动网络)

接收错误:xhr 轮询错误 socket.io 客户端反应

在 android 上使用 Socket.IO 总是返回 XHR 轮询错误

socket.io 服务器在注册客户端断开连接时非常延迟

通过 websockets 的 Socket.io - 随机“传输端”断开连接

socket.io 不适用于传输:['xhr-polling']