AppEngine Channel API - 检查频道是否仍处于打开状态的最佳方式(服务器端)

时间:2011-01-26 11:38:49

标签: api sockets google-app-engine channel-api

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

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

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

1 个答案:

答案 0 :(得分:18)

第1部分:解决您的问题

如果您确实需要跟踪客户端连接,请参阅下面的第2部分,但我不确定您的问题是否可以解决您的问题。

让我看看我是否可以回复你的问题:你正在写一个聊天应用程序,但这是一个不完全是AJAX的网站(就像gmail那样);该网站包含页面导航,您可能需要在用户点击指向其他页面的链接后重新设置您的频道。当用户导航时,将呈现新页面,并且您希望避免在该点获取新标记;您希望重用具有相同客户端ID的现有令牌和通道。

如果这是正确的,我有两个备用解决方案,一个简单但用户体验不佳,一个更棘手,但最终结果更顺畅。

  • 保留Cookie中的令牌。重新渲染页面时,只需使用cookie中的标记,而不是再次调用channel.create_channel。当令牌过期时,您将获得一个错误回调,就像用户留在原始页面上一样;此时,再次调用channel.create_channel。这个问题是由于Comet连接的性质,重新连接可能很慢(在坏情况下最多可达10秒或更长时间)。

  • 在iframe中整理与聊天无关的整个网站。将频道创建代码和UI放在外部iframe中。这样,您不必在每次用户导航时重新连接。这可以避免导航停机。请注意,orkut使用这种技术,浮动div,因为少量的Firebug调查会显示出来。

第2部分:您的功能请求

如果事实证明我是误会,你确实需要跟踪客户端连接:

现在无法检查客户端是否已连接到客户端ID标识的频道。

但是,我现在正在努力添加“在线状态”(在聊天意义上),这样当您的应用程序连接或断开与使用给定客户端ID创建的频道时,您的应用可以注册以获取帖子。您也可以“探测”状态,查询给定的客户端ID是否已连接(仍在处理此部分的详细信息)。

请注意,这不是基于令牌的,而是基于客户端ID。

我还没有明确的发布日期,但正如我所说,我现在正积极致力于此。

与此同时,你可以使用来自客户端的心跳HTTP请求回到你的应用程序,说“嘿,我还在这里”每分钟左右。您需要执行某些任务,例如每2分钟运行一次,并将未签入的任何客户端标记为非活动状态,并且您需要将此数据存储在某个位置。