我有一个客户端/服务器应用程序,在服务器上使用nodejs,socket.io作为连接机制。由于与我的应用程序相关的原因,我希望每个浏览器只有一个活动连接,并拒绝来自其他选项卡的所有连接,这些连接可能会在会话期间稍后打开。这适用于WebSockets,但如果浏览器不支持WebSockets并且使用XHR轮询,则断开连接永远不会发生,因此如果用户只刷新页面,则不会将其解释为重新连接(我有延迟)重新连接和会话恢复),但作为一个新选项卡,由于此相同选项卡生成的旧连接仍处于活动状态,因此在连接中被拒绝。
我正在寻找一种方法,只要发生刷新,就可以有效地终止客户端的连接。我尝试绑定到beforeunload
并在客户端调用socket.disconnect()
,并发送消息socket.emit('force-disconnect')
并触发与服务器的断开连接但没有成功。我在这里错过了什么吗?感谢您的帮助!
我已阅读this question,但发现它对我的具体案例无用。
答案 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