7

我在 AppEngine 上构建了一个社交网络/约会类型的应用程序,目前正在添加基于 Channel API 构建的聊天。但是,我遇到的问题是用户可能会在聊天进行时重新加载或导航到新页面(就像他们在 Facebook 中一样)。这意味着服务器不容易知道它是否应该为给定的客户端生成一个新的通道 ID 令牌,或者给定的客户端是否已经被分配了一个通道令牌。

如果有一种方法可以检查(服务器端)特定客户端是否已经打开了通道,那将非常有用。例如,如果我为客户端“Jack”分配“Jack-Jan-21-2010”的频道 ID,那么我希望能够在服务器端检查是否已经有一个与 ID 关联的频道打开杰克-2010 年 1 月 21 日”。这可以(在某种程度上)通过观察 onerror() 和 onclose() 回调在客户端进行跟踪,但我看不到任何服务器端允许我检查与给定 ID 关联的通道是否为已经打开了。

有谁知道在使用 AppEngine Channel API 时检查(服务器端)通道是否已打开的智能方法?

4

1 回答 1

18

第 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 分钟运行一次,并将尚未签入的所有客户端标记为非活动状态,并且您需要将这些数据存储在某个地方。

于 2011-01-26T16:39:43.373 回答