我在手机上使用我的 GAE 应用程序。即使我通过 socket.close() 函数手动关闭套接字,我在获取通道 api 中的 /_ah/channel/disconnected 的断开连接通知时也遇到了问题。该帖子在延迟一分钟后发生。有谁知道加快速度的方法?在我的情况下,socket.close() 不会产生通道断开通知(尽管仅在手机中.. 它可以在笔记本电脑上完美运行)!
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 时请求更好的断开连接通知。
希望有帮助;抱歉,现在没有一个简单的答案。