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