Jabber用户离线:为什么两种不同的场景?

Rai*_*a M 5 erlang android xmpp ejabberd user-presence

我有一个Android客户端与ejabberd XMPP服务器协同工作.

观察:

  • 场景1:当我向右滑动应用程序(终止应用程序)时,用户立即在服务器上脱机.它的状态在那一瞬间变为离线状态.

  • 场景2:然而,当我简单地关闭我的Android Jabber客户端的Wi-Fi连接(数据)时,用户在服务器上标记为脱机时会有几分钟的明显滞后.

我无法弄清楚这两个过程的根本区别.

在场景2中可以做些什么来使其立即脱机

Dev*_*Dev 2

场景 1:当我向右滑动应用程序(终止应用程序)时,用户立即在服务器上离线。其状态随即变为离线。

在上述情况下,您的 Android xmpp 客户端在关闭 Android 应用程序之前发送状态为不可用,也许您的 Android XMPP 客户端正在维护后台服务,当您关闭应用程序方法时,该后台服务又会维护与 XMPP 服务器的持久 XMPP 连接(TCP 套接字 onDestroy())服务将被调用,并且可以检查 XMPP 连接是否仍然连接。如果是,则发送不可用状态,这将安全地使用户在服务器上离线,然后断开 XMPP 连接(套接字)。

场景 2:但是,当我简单地关闭 Android Jabber 客户端的 Wi-fi 连接(数据)时,用户在服务器上被标记为离线会出现明显的几分钟延迟。

正如我之前提到的,Android 设备可以在服务中维持持久的 XMPP 连接,当您关闭 wifi 并且与服务器的 XMPP 连接(TCP 套接字)仍然连接时,无法从 XMPP 服务器安全删除用户 [客户端可以' t 发送状态为不可用] 意味着连接刚刚挂断并且 Android 客户端/XMPP 服务器不知道这一点。在这种情况下,现在服务器将根据客户端理想时间段计算出客户端挂起[即在固定时间间隔内套接字上没有通信],并使用户离线。此过程非常耗时,因此您会看到几分钟的延迟。

在场景2中可以做什么来使其立即离线

您可以配置XMPP服务器并制作客户端

由于这个问题可以从 XMPP 客户端和服务器上处理,从客户端你可以固定间隔时间 ping,如果你保持 ping 持续时间足够小,你可以检测到丢失的连接(如套接字上的管道损坏),如果你保持 ping 在服务器端也是如此[记住这是服务器到客户端的 ping] 很小,您可以检测到连接丢失。

正如我所看到的,您正在使用 ejabberd 作为您的 XMPP 服务器,此链接上给出的详细信息显示,

如何检测死连接?

检测死连接的一种方法是定期对客户端执行 ping 操作,如果客户端没有响应,则终止连接。这可以使用 mod_ping 来完成。然而,这些 ping 数据包可能会唤醒客户端的无线电,因此较短的 ping 间隔可能会耗尽移动设备的电池。因此,一般不建议使用小于几分钟的间隔。不管怎样,总有一些时间窗口可能会丢失消息。