socket.io 服务器在注册客户端断开连接时非常延迟
Posted
技术标签:
【中文标题】socket.io 服务器在注册客户端断开连接时非常延迟【英文标题】:socket.io server very delayed in registering client disconnects 【发布时间】:2012-05-30 15:09:20 【问题描述】:我有一个使用 xhr 作为其唯一传输的 socket.io 连接。当我在浏览器中加载应用程序(在 chrome 和 ff 中测试)时,套接字连接并且一切正常,直到我离开页面。如果我重新加载浏览器,我可以看到客户端发出了“断开连接”事件,但服务器断开连接事件在很长一段时间内都不会触发(可能是客户端心跳超时时)。这是一个问题,因为当客户端断开连接时,我在服务器中进行了一些清理工作。如果客户端重新加载,我会在断开连接之前收到多个连接事件。我也尝试在窗口的“beforeunload”事件中手动从客户端发出断开消息,但无济于事。有什么想法吗?
我调试了 socket.io 服务器,我可以确认 Manager.prototype.onClientDisconnect 只是因为“关闭超时”的原因而受到打击。
【问题讨论】:
【参考方案1】:经过一些调试,我注意到 socket.io Manager 对象中有以下配置:
blacklist : ['disconnect']
这会导致 namespace.js 的这个分支不处理事件:
case 'event':
// check if the emitted event is not blacklisted
if (-~manager.get('blacklist').indexOf(packet.name))
this.log.debug('ignoring blacklisted event `' + packet.name + '`');
else
var params = [packet.name].concat(packet.args);
if (dataAck)
params.push(ack);
socket.$emit.apply(socket, params);
此拉取请求https://github.com/LearnBoost/socket.io/pull/569 中详细说明了更改。我理解 XHR 为何如此,因为任何人都可以发送带有随机会话 ID 的 HTTP 请求,试图断开其他用户与服务器的连接。
我打算改为在每个新连接中检查服务器中现有会话 ID,并确保在继续连接逻辑之前运行我的断开逻辑。
【讨论】:
以上是关于socket.io 服务器在注册客户端断开连接时非常延迟的主要内容,如果未能解决你的问题,请参考以下文章
socket.io 客户端在长 Node.js 函数中自动断开连接