我有浏览器客户端 Javascript,它打开一个 WebSocket(使用 socket.io)来请求一个长时间运行的进程启动,然后在进程完成时得到一个回调。当我收到回调时,我会更新网页以让用户知道该过程已完成。
这工作正常,除了在我的 iPad 上,当我切换到另一个应用程序然后返回时(它永远不会收到回调,因为我猜该应用程序当时不在线)。我假设在等待回调时休眠的笔记本电脑或其他计算机上也会发生同样的事情。
是否有一种标准方法(或任何方法)来处理这种情况?谢谢。
作为引用,如果您想查看问题页面,它位于 http://amigen.perfectapi.com/
最佳答案
在这种情况下需要考虑几件事:
检测应用下线/上线
参见:Online and offline events .
当您的应用在计算机唤醒后检测到 online
事件时,您可以获得您错过的任何信息。
对于较旧的网络浏览器,您需要以更聪明的方式执行此操作。在 Pusher我们在客户端和服务器之间添加了 ping - pong 检查。如果客户端在一定时间内没有收到 ping,它就知道存在连接问题。如果服务器发送了一个 ping 但在一定时间内没有收到 pong,它就知道有问题了。
乒乓机制是defined in the spec但目前尚未在 WebSocket API 上定义发送 ping 或 pong 的方式。
获取丢失的信息
大多数实时服务器只向连接的客户端传递消息。如果客户端未连接,可能是由于暂时的网络干扰或他们的计算机已经休眠了一段时间,那么这些客户端将错过消息。
一些框架确实提供了通过历史记录/缓存访问消息的权限。对于那些不需要的,您需要检测问题(如上所述),然后获取任何遗漏的消息。执行此操作的一个好方法是为每条消息提供时间戳或序列 ID,这样您就可以调用您的网络服务器说“给我自 X 以来的所有消息”。
关于javascript - 如何从进入休眠状态的 WebSocket 客户端计算机或进入后台的应用程序恢复(iPad 上的 Safari),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8853048/