【问题标题】:AppEngine Channel API - Best way to check if a channel is still open (server side)AppEngine Channel API - 检查通道是否仍然打开的最佳方法(服务器端)
【发布时间】:2011-06-15 19:17:46
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 哇,很好的答案。我将在接下来的几个小时内消化它。谢谢和亲切的问候。 -亚历克斯
    • 您已经准确地回应了我的问题,并且您提出的解决方案似乎是合理的解决方法。我认为 iframe 解决方案看起来很有趣,并且可能会解决我的问题。
    • Moishe,如果你在下一个版本中完成“存在”,我会给你买一个美味的 turkey sammich。 kthnx :)
    • 为什么心跳必须在 POST 中?
    • 很抱歉,它不一定是 POST。只是某种 HTTP 请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2023-01-31
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多