【问题标题】:Channel disconnect notification in channel api in google app engine谷歌应用引擎中频道 api 中的频道断开通知
【发布时间】:2011-12-05 20:55:43
【问题描述】:

我正在手机上使用我的 GAE 应用程序。即使我通过 socket.close() 函数手动关闭套接字,我在获取通道 api 中的 /_ah/channel/disconnected 的断开连接通知时也遇到了问题。该帖子在延迟一分钟后发生。有谁知道加快速度的方法?在我的情况下,socket.close() 不会产生通道断开通知(虽然仅在手机中.. 它可以在笔记本电脑上完美运行)!

【问题讨论】:

    标签: javascript python google-app-engine channel-api


    【解决方案1】:

    Channel API 前端服务器“意识到”通道已断开连接所花费的时间取决于浏览器的实现。

    在性能良好的浏览器上,我们捕获 beforeunload 事件并向我们的前端发布一条消息,上面写着“此客户端即将离开”。在其他浏览器上,我们可能无法获取事件(或者由于各种实现原因,我们可能无法收听它,例如浏览器发送它过于频繁(FFFUUUU IE)),或者一旦我们收到事件,我们发送的 XHR 可能会得到吞下。在这些情况下,前端服务器意识到客户端已经消失,因为它无法接收到心跳——这就是你手机上发生的事情。 (出于好奇,什么手机?)

    您的案例很有趣,因为您明确地调用了 onclose。唯一要做的就是处理具有 Channel FE 代码的 iframe —— 换句话说, onclose 只是表现得好像整个浏览器窗口都关闭了;它没有利用浏览器仍处于良好状态并且可以等待关闭直到发送消息这一事实。

    所以我建议做两件事:在您的代码中添加一个自定义处理程序(它与您的 /_ah/disconnect 处理程序执行相同的操作),这样您就可以在知道您手动关闭通道时创建一个 XHR。这很笨拙但很实用。令人遗憾的是,您需要在 javascript 代码中明确知道您的客户端 ID。

    其次,向我们的问题跟踪器 (http://code.google.com/p/googleappengine/issues/list) 添加一个问题,以便在明确调用 onclose 时请求更好的断开连接通知。

    希望有所帮助;抱歉,现在没有一个简单的答案。

    【讨论】:

    • 是的,我明白你的意思。但是即使我添加了一个自定义处理程序并在那里执行逻辑,如果浏览器 beforeunload 事件发生并且通道断开连接怎么办!你是在告诉我也要听 beforeunload 事件吗?这在手机中没有任何网格的情况下可以工作吗?
    • 我刚刚发现在 iPad、iPhone 等设备上运行的 safari 不支持 onbeforeunload。我认为这是我面临的问题。所以我可以添加一个自定义处理程序,正如您在上一篇文章中提到的那样,但是当用户关闭浏览器或导航到其他页面时,我将无法收听该事件,对吧?还有其他方法可以摆脱这种情况吗?非常感谢
    • 您描述问题的方式听起来像是您在频道上手动调用关闭 - 我的想法是,如果您这样做,那么您也可以通过 XHR 向您的应用发送消息说“我要关闭这个频道”。但是,在浏览器关闭并且从不调用 onbeforeunload 的情况下,您是对的,没有简单的方法可以知道它。这就是我们在前端使用心跳的原因——当我们有一分钟没有得到心跳时,我们会关闭通道并通知您的应用程序。
    猜你喜欢
    • 2011-12-27
    • 2013-07-31
    • 2012-05-25
    • 2020-09-07
    • 1970-01-01
    • 2011-06-04
    • 2015-06-06
    • 2012-01-06
    • 1970-01-01
    相关资源
    最近更新 更多