socket.io如何通过XHR-polling强制断开连接

5
我有一个使用Node.js作为服务器端,Socket.io作为连接机制的客户端/服务器应用程序。由于我的应用程序相关原因,我想每个浏览器只保持一条活动连接,并拒绝后面在会话期间打开的其他选项卡的所有连接。这对WebSockets非常有效,但如果浏览器不支持WebSockets并且使用XHR-polling,断开连接永远不会发生,所以如果用户刷新页面,这并不被解释为重新连接(我有重连和会话恢复的延迟),而是作为新选项卡结束,导致连接被拒绝,因为此选项卡创建的旧连接仍然是活动的。
我正在寻找一种在刷新时从客户端有效地结束连接的方法。我尝试绑定到beforeunload并在客户端上调用socket.disconnect(),还尝试发送像socket.emit('force-disconnect')这样的消息,并通过服务器触发断开连接,但都没有成功。我错过了什么吗?感谢您的帮助!
我阅读了this question,但在我的特定情况下找不到有用的信息。
2个回答

10

问题已解决,原来是由于 socket.io 0.9.5 中引入的一个漏洞。如果你遇到了这个问题,请将服务端和客户端代码都更新至 socket.io > 0.9.9,并将客户端的 socket.io 选项 sync disconnect on unload 设置为 true 即可解决。

设置选项的方法如下:

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

1
我想我会等待engine.io被合并。 - ngzhongcai
太棒了 - 为我避免了一些大麻烦。这里有一个非常真实的问题:你是怎么找到这个选项的?我似乎只在 StackOverflow 和其他地方看到类似的东西。你是如何发现这个标志的?对于其他勇敢的探险家:通过一些谷歌搜索,我找到了这个 socket.io 配置选项页面。 https://github.com/LearnBoost/socket.io/wiki/Configuring-Socket.IO - EML
谢谢!它真的帮了我很多.. 我会在论坛和其他地方发布它 :D - julian
@IsraelG。我会感激您提供这个问题的链接! - scanales
1
@ngzhongcai请查看此答案,了解为什么在iOS上同步断开连接不起作用的更多细节:http://stackoverflow.com/a/18064892/69868 - Miroslav Bajtoš
显示剩余5条评论

0

如果您使用的打开文件描述符数量不足,也可能会出现“错误:xhr轮询错误”。这在负载测试期间很可能发生。

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

ulimit -n

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接