socket.io 服务器在注册客户端断开连接时非常延迟



我有一个使用 xhr 作为唯一传输的 socket.io 连接。 当我在浏览器中加载应用程序(在 chrome 和 ff 中测试)时,套接字连接并且一切正常,直到我离开页面。 如果我重新加载浏览器,我可以看到客户端发出"断开连接"事件,但服务器断开连接事件在很长一段时间内都不会触发(大概是在客户端检测信号超时时)。 这是一个问题,因为当客户端断开连接时,我在服务器中执行一些清理工作。如果客户端重新加载,则在触发断开连接之前,我会收到多个连接事件。我也尝试在窗口的"beforeunload"事件中手动从客户端发出断开连接消息,但无济于事。 有什么想法吗?

我调试了 socket.io 服务器,我可以确认 Manager.prototype.onClientDisconnect 只是由于"关闭超时"原因而受到攻击。

经过一些调试,我注意到 socket.io 管理器对象中的以下配置:

blacklist : ['disconnect']

这会导致命名空间中的此分支.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,并确保在继续连接逻辑之前运行我的断开连接逻辑。

最新更新