socket.io强制断开XHR轮询

我有一个客户端/服务器应用程序使用服务器上的nodejs和socket.io作为连接机制。 由于与我的应用程序相关的原因,我希望每个浏览器只有一个活动连接,并拒绝来自其他选项卡的所有连接,这些连接可能在会话期间稍后打开。 这对于WebSockets非常有用,但是如果浏览器不支持WebSockets,而是使用XHR-polling,那么断开连接就不会发生,所以如果用户只是刷新页面,这不会被解释为重新连接(我有一个延迟重新连接和会话恢复),但作为一个新的选项卡,在连接被终止,因为这个相同的选项卡所做的旧连接仍然是活动的。

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

我读过这个问题 ,并没有find它对我的具体情况有用。

解决了这个问题,事实certificate这是在socket.io 0.9.5引入的一个bug 。 如果你有这个问题,只要将你的服务器端和客户端代码更新到socket.io > 0.9.9 ,并将socket.io客户端选项sync disconnect on unloadtrue并且你已经设置好了。

选项是这样设置的:

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

如果用完可用的打开的文件描述符,也可以得到“错误:xhr轮询错误”。 这在负载testing中可能会发生。

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

 ulimit -n 

增加到一个很高的数字:

 ulimit -n 1000000