socket.io强制断开XHR轮询

时间:2012-08-20 19:30:49

标签: node.js socket.io long-polling

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

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

我已阅读this question,但发现它对我的具体案例无用。

2 个答案:

答案 0 :(得分:10)

解决了这个问题,结果发现它是socket.io 0.9.5中引入的bug。如果您遇到此问题,只需将您的服务器和客户端代码更新为socket.io > 0.9.9,并将socket.io客户端选项sync disconnect on unload设置为true,并且您已完成设置。< / p>

选项以这种方式设置:

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

答案 1 :(得分:0)

如果您的可用打开文件描述符用完,您还可以获得“错误:xhr轮询错误”。这可能发生在负载测试期间。

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

ulimit -n

将它增加到一个很高的数字:

ulimit -n 1000000