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

Node.js socket.io强制通过XHR轮询断开连接,node.js,socket.io,long-polling,Node.js,Socket.io,Long Polling,我有一个客户机/服务器应用程序,在服务器上使用nodejs和socket.io作为连接机制。出于与我的应用程序相关的原因,我希望每个浏览器只有一个活动连接,并拒绝会话期间稍后打开的其他选项卡的所有连接。这对WebSockets非常有效,但是如果浏览器不支持WebSockets,而使用XHR轮询,则断开连接不会发生,因此如果用户只是刷新页面,这不会被解释为重新连接,我会延迟重新连接和会话恢复,而是作为一个新选项卡,由于同一选项卡创建的旧连接仍处于活动状态,因此以拒绝连接结束 我正在寻找一种方法,以

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

我正在寻找一种方法,以便在刷新发生时有效地结束客户端的连接。我尝试绑定到beforeunload并在客户端调用socket.disconnect,还发送了类似socket.emit'force-disconnect'的消息,并触发了与服务器的断开连接,但没有成功。我是不是遗漏了什么?谢谢你的帮助


我已经读过了,但没有发现它对我的特殊情况有用。

解决了这个问题,原来它是在socket.io 0.9.5中引入的。如果出现此问题,只需将服务器端和客户端代码更新为socket.io>0.9.9,并将socket.io客户端选项“卸载时同步断开连接”设置为true,即可完成所有设置

选项的设置方式如下:

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

如果没有可用的打开文件描述符,还可以得到错误:xhr poll Error。这可能在负载测试期间发生

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

ulimit -n
将其增加到一个较高的数字:

ulimit -n 1000000

我就是这么做的。。。1 npm install socket.io 2npm install socket.io-client 3 var socket=io.connect,{'sync disconnect on unload':true};在客户端。Xhr轮询在Chrome浏览器上正常工作。但不是在我的iPad上。嗯,不知道为什么iPad的处理方式不同。。。您是否尝试过禁用所有其他传输以确保它仅通过XHR轮询进行,因为这是我们在这里讨论的传输?非常确定,只有传输选项中的XHR轮询Think I将等待engine.io被禁用merged@ngzhongcai有关为什么同步断开连接在iOS上不起作用的更多详细信息,请参阅此答案: