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

Javascript socket.io服务器在注册客户端断开连接时非常延迟,javascript,node.js,socket.io,long-polling,Javascript,Node.js,Socket.io,Long Polling,我有一个socket.io连接,使用xhr作为它的唯一传输。当我在浏览器中加载应用程序(在chrome和ff中测试)时,套接字连接,一切正常,直到我离开页面。如果重新加载浏览器,我可以看到客户端发出“断开连接”事件,但服务器断开连接事件在很长时间内不会触发(可能是在客户端心跳超时时)。这是一个问题,因为当客户端断开连接时,我会在服务器上做一些清理工作。如果客户端重新加载,我会在触发disconnect之前收到多个连接事件。我也尝试过在窗口的“beforeunload”事件中手动从客户端发出一条断

我有一个socket.io连接,使用xhr作为它的唯一传输。当我在浏览器中加载应用程序(在chrome和ff中测试)时,套接字连接,一切正常,直到我离开页面。如果重新加载浏览器,我可以看到客户端发出“断开连接”事件,但服务器断开连接事件在很长时间内不会触发(可能是在客户端心跳超时时)。这是一个问题,因为当客户端断开连接时,我会在服务器上做一些清理工作。如果客户端重新加载,我会在触发disconnect之前收到多个连接事件。我也尝试过在窗口的“beforeunload”事件中手动从客户端发出一条断开连接消息,但没有效果。有什么想法吗


我调试了socket.io服务器,我可以确认Manager.prototype.onClientDisconnect只是因为“关闭超时”的原因才被点击。

在进一步调试之后,我注意到socket.io管理器对象中的以下配置:

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);
}
此请求中详细介绍了更改。我理解为什么XHR要这样做,因为任何人都可以发送带有随机会话ID的HTTP请求,试图断开其他用户与服务器的连接

我计划改为检查服务器中每个新连接的现有会话id,并确保在继续连接逻辑之前运行断开连接逻辑