谷歌应用引擎中的通道API中的通道断开通知

4

我正在使用我的手机上的GAE应用程序。即使我手动通过socket.close()函数关闭套接字,但在通道api中获取断开连接通知到/_ah/channel/disconnected时遇到了问题。帖子在一分钟左右的延迟后出现。有人知道如何加快速度吗? 在我的情况下,socket.close()不会产生频道断开通知(尽管从笔记本电脑中完全正常工作)!

1个回答

4
Channel API前端服务器意识到通道断开所需的时间取决于浏览器的实现。在行为良好的浏览器上,我们捕获beforeunload事件并向前端发送一条消息,说明“此客户端正在关闭”。在其他浏览器上,我们可能无法获取该事件(或者由于各种实现原因,比如浏览器过于频繁地发送该事件(IE太烦人了)),或者一旦我们获取该事件,我们发送的XHR可能会被忽略。在这些情况下,前端服务器会意识到客户端已经离开,因为它未能收到心跳信号——这就是你手机上发生的事情。(顺便问一下,你用的是什么手机?)
你的情况很有趣,因为你明确调用了onclose。这样做的唯一作用是处理包含Channel FE代码的iframe;换句话说,onclose的行为就像整个浏览器窗口已经关闭一样,它没有利用浏览器仍处于良好状态并可以等待直到发送消息的优势。
因此,我建议两件事:为你的代码添加一个自定义处理程序(执行与/ _ah / disconnect处理程序相同的操作),这样当你知道手动关闭通道时,只需进行XHR即可。这很麻烦但很实用。不好的地方在于你需要在javascript代码中明确知道你的客户端ID。
其次,在我们的问题跟踪器(http://code.google.com/p/googleappengine/issues/list)上添加一个问题,请求在显式调用onclose时提供更好的断开连接通知。
希望这有所帮助;很抱歉现在没有简单的答案。

我明白你的意思。但是,即使我添加自定义处理程序并在那里执行逻辑,如果发生浏览器的beforeunload事件并且通道断开连接怎么办!你是在告诉我也监听beforeunload事件吗?这样做是否可以在手机中没有任何网状结构的情况下工作? - Hari
我刚刚发现在iPad、iPhone等设备上运行的Safari不支持onbeforeunload。我认为这就是我面临的问题。所以我可以像你在之前的帖子中提到的那样添加自定义处理程序,但是当用户关闭浏览器或导航到其他页面时,我将无法监听事件,对吗?有没有其他方法可以解决这个问题呢?非常感谢。 - Hari
从你描述的问题来看,听起来像是你手动调用了通道的关闭 - 我的想法是,如果你这样做了,那么你也可以通过XHR向你的应用程序发送一条消息,说“我正在关闭这个通道”。但是,在浏览器关闭并且从未调用onbeforeunload的情况下,你是正确的,没有简单的方法可以知道它。这就是为什么我们在前端使用心跳的原因 - 当我们一分钟内没有收到心跳时,我们会关闭通道并通知您的应用程序。 - Moishe Lettvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接