AppEngine Channel API - 检查通道是否仍然打开的最佳方法(服务器端)

2023-11-22

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

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

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AppEngine Channel API - 检查通道是否仍然打开的最佳方法(服务器端) 的相关文章

随机推荐