2

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

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

4

1 回答 1

3

经过更多调试后,我注意到 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,并确保在继续连接逻辑之前运行我的断开逻辑。

于 2012-05-24T19:37:39.937 回答