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

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

我debugging了socket.io服务器,并且我可以确认Manager.prototype.onClientDisconnect只是因为“closures超时”原因而被触发。

经过一些更多的debugging之后,我注意到了socket.iopipe理器对象中的以下configuration:

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,因为任何人都可以发送HTTP请求与随机会话ID试图断开其他用户从服务器。

我打算做的是检查服务器中现有会话ID的每个新连接,并确保在继续连接逻辑之前运行断开逻辑。