第 1 部分:解决您的问题
如果您确实需要跟踪客户端连接,请参阅下面的第 2 部分,但我不确定您的问题是否可以解决您的问题。
让我看看我是否可以回复您的问题:您正在编写一个聊天应用程序,但它是针对一个不完全 AJAX 的网站(例如,gmail 的方式);该网站包含页面导航,您可能需要在用户单击另一个页面的链接后重新设置您的频道。当用户导航时,会呈现新页面,并且您希望避免此时获得新令牌;您想重用具有相同客户端 ID 的现有令牌和通道。
如果这是正确的,我有两种替代解决方案,一种简单但用户体验不佳,另一种更棘手但最终结果更流畅。
将令牌保留在 cookie 中。当您重新渲染页面时,只需使用 cookie 中的令牌,而不是再次调用 channel.create_channel。当令牌过期时,您将收到一个 onerror 回调,就像用户停留在原始页面上一样;此时,再次调用 channel.create_channel。这样做的问题是,由于 Comet 连接的性质,重新连接可能会很慢(在坏情况下最多 10 秒或更长时间)。
将与聊天无关的整个网站包装在 iframe 中。将您的频道创建代码和 UI 放在外部 iframe 中。这样您就不必在每次用户导航时重新连接。这避免了导航的停机时间。请注意,orkut 使用这种技术,带有浮动 div,少量的 Firebug 调查会发现。
第 2 部分:您的功能请求
如果事实证明我误解了,您确实需要跟踪客户端连接:
现在没有内置的方法来检查客户端是否连接到由客户端 ID 标识的通道。
但是,我现在正在添加“状态”(在聊天意义上),以便您的应用程序可以在客户端连接到使用给定客户端 ID 创建的频道或从频道断开连接时注册以获取帖子。您还可以“探测”存在,以查询给定的客户端 ID 是否已连接(仍在处理这部分的详细信息)。
请注意,这不是基于令牌的,而是基于客户端 ID 的。
我还没有确定的发布日期,但正如我所说,我现在正在积极努力。
同时,您可以使用从客户端返回到您的应用程序的心跳 HTTP 请求,每分钟左右说“嘿,我还在这里”。您需要执行某种任务,例如每 2 分钟运行一次,并将尚未签入的所有客户端标记为非活动状态,并且您需要将这些数据存储在某个地方。