2011-06-08 84 views
6

我正在使用socket.io和node.js.由于socket IO识别出XHR-Polling客户端断开连接之前的几秒钟延迟,因此我在跟踪哪些用户在线时遇到了问题。Socket.IO:XHR-断开连接时轮询延迟

如果XHR轮询客户端刷新页面,他们的新连接消息似乎在其断开连接消息之前。当试图追踪哪些用户在线时会造成混淆。

一种解决方案可能是检测服务器端的传输方法并延迟XHR轮询客户端的连接以确保首先运行断开连接功能。

有没有人有这方面的经验?

+2

为什么你不能假设用户在线,直到断开连接事件被触发。我同意你会有一个重叠的地方,当两个用户只有一个在线时会出现在网上,但是如果你根据特定的用户标识符来识别连接,那么应该没有问题。如果不是,最坏的情况是让用户在线显示几秒钟。我不认为增加延迟是执行良好断开检测的特别可靠的方法。 – davin 2011-06-08 15:27:22

+0

我同意戴文。我使用那些“这个人在线”作为最佳猜测,估计该人当时在线,而不是法律。如果我想知道他们在做什么,我会给他们打电话。 – jcolebrand 2011-06-08 15:38:32

+0

这是我们在[Pusher](http://pusher.com)中添加了支持的内容,我们使用名为[Presence Channels](http://pusher.com/docs/presence)的内容来执行此操作。 – leggetter 2011-06-09 11:55:56

回答

3

作为@davin和@jcolebrand在评论中指出的存在性的主要问题是仅靠连接不能被依赖。在用户离开页面后,网络设备可以保持连接状态。所以,你需要其他的东西来确认用户的存在。

这是我们在Pusher添加了支持,我们使用Presence Channels这样的东西来做这件事。

我们使用唯一的用户标识来管理此标识,您(开发人员)必须在用户连接时提供该用户标识,并结合标识连接的唯一套接字标识。由于这个唯一的用户ID只能在一个存在成员列表中出现一次,这意味着该用户只会被列出一次 - 即使他们有多个连接打开,因此也有多个套接字连接。

同样的想法可以应用于HTTP连接。

对此的一般方法是使用会话来唯一标识用户。就这样,即使他们只是一个“客人”,只要他们允许使用cookies,你仍然可以识别他们。

因此,系统上的用户数量应该最大限度地取决于您在服务器上运行的活动会话的数量。

希望这会有所帮助。如果您想澄清任何事情,请告诉我。

1

我正在开发一个聊天支持解决方案,并且参加者必须知道客户端何时连接。使用websocket可以正常工作,但是使用whr-pooling,有时候,参与者只是断开连接(在某些情况下为5秒)。有时候不会出现。我所做的:我只需进入该页面,然后等待终端应用程序。

我使用的NodeJS,nowjs

您正在使用什么版本socket.io的
1

?我遇到过这个问题并解决了它 on this post。原来在socket.io 0.9.5中引入了beforeunload事件时发送的请求中发生的错误,该错误阻止了正确的断开连接。