我有一个与 ejabberd XMPP 服务器协同工作的 Android 客户端。
观察:
场景 1:当我向右滑动应用程序(杀死应用程序)时,用户立即在服务器上离线。它的状态在那一刻变为离线。
场景 2:但是,当我简单地关闭我的 Android Jabber 客户端的 Wi-fi 连接(数据)时,用户在服务器上被标记为离线时会有明显的延迟几分钟。
我无法弄清楚这两个过程的根本区别是什么。
场景二有什么办法让它立即下线?
我有一个与 ejabberd XMPP 服务器协同工作的 Android 客户端。
观察:
场景 1:当我向右滑动应用程序(杀死应用程序)时,用户立即在服务器上离线。它的状态在那一刻变为离线。
场景 2:但是,当我简单地关闭我的 Android Jabber 客户端的 Wi-fi 连接(数据)时,用户在服务器上被标记为离线时会有明显的延迟几分钟。
我无法弄清楚这两个过程的根本区别是什么。
场景二有什么办法让它立即下线?
场景 1:当我向右滑动应用程序(杀死应用程序)时,用户立即在服务器上离线。它的状态在那一刻变为离线。
onDestroy()
在上述情况下,您的 Android xmpp 客户端在关闭您的 Android 应用程序之前发送状态为不可用,也许您的 Android XMPP 客户端正在维护一个后台服务,当您关闭您的应用程序方法时,该服务反过来维护到 XMPP 服务器的持久 XMPP 连接(TCP 套接字) 服务将被调用,并且可以检查 XMPP 连接是否仍然连接。如果是,则将状态发送为不可用,这将安全地使用户在服务器上脱机,然后断开 XMPP 连接(套接字)。
场景 2:但是,当我简单地关闭我的 Android Jabber 客户端的 Wi-fi 连接(数据)时,用户在服务器上被标记为离线时会有明显的延迟几分钟。
正如我之前提到的,Android 设备可以在服务中保持持久的 XMPP 连接,当您关闭 wifi 并且您与服务器的 XMPP 连接(TCP 套接字)仍然连接时,无法从 XMPP 服务器安全删除用户 [客户端可以' t 发送状态为不可用] 表示连接刚刚挂断,Android 客户端/XMPP 服务器不知道它。在这种情况下,现在服务器将在客户端理想时间段内确定客户端挂机[即在固定间隔内套接字上没有通信],并使用户处于脱机状态。此过程非常耗时,因此您会看到几分钟的延迟。
场景二有什么办法让它立即下线?
您可以配置 XMPP 服务器并制作客户端
由于可以从 XMPP 客户端和服务器处理此问题,因此您可以从客户端固定间隔时间 ping,如果您保持 ping 持续时间足够小,您可以检测到丢失的连接(如套接字上的管道损坏),如果您保持 ping,服务器端的方式相同inter [记住这是服务器到客户端的 ping] 很小,您可以检测到连接丢失。
正如我所看到的,您正在使用 ejabberd 作为您的 XMPP 服务器,此链接上给出的详细信息说,
如何检测死连接?
检测死连接的一种方法是定期 ping 客户端并在客户端没有响应时终止连接。这可以使用 mod_ping 来完成。但是,这些 ping 数据包可能会唤醒客户端的无线电,因此较短的 ping 间隔可能会耗尽手机电池。因此,一般不建议使用少于几分钟的间隔。无论哪种方式,总有一些时间窗口可能会丢失消息。