5

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

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

我已经阅读了这个问题,但找不到它对我的特定情况有用。

4

2 回答 2

10

解决了这个问题,原来socket.io 0.9.5. 如果您遇到此问题,只需将您的服务器和客户端代码都更新为socket.io > 0.9.9并将 socket.io 客户端选项设置sync disconnect on unloadtrue,一切就绪。

选项是这样设置的:

var socket = io.connect('http://yourdomain.com', {'sync disconnect on unload' : true});
于 2012-08-21T16:19:41.493 回答
0

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

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

ulimit -n

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

ulimit -n 1000000
于 2014-01-30T11:08:39.700 回答