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 在空闲时断开客户端的连接

如何从客户端断开和重新连接 socket.io?

socket.io 客户端在长 Node.js 函数中自动断开连接

如何在socket.io中的断开事件上获取断开连接的客户端的套接字ID

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

Socket io客户端在react-native应用程序中不断断开和重新连接