Android Jabber用户离线:为什么会出现两种不同的情况?
我有一个Android客户端与ejabberd XMPP服务器协同工作 意见:Android Jabber用户离线:为什么会出现两种不同的情况?,android,erlang,xmpp,ejabberd,user-presence,Android,Erlang,Xmpp,Ejabberd,User Presence,我有一个Android客户端与ejabberd XMPP服务器协同工作 意见: 场景1:当我向右滑动应用程序(杀死应用程序)时,用户立即在服务器上脱机。就在那一刻,它的状态变为离线 场景2:然而,当我简单地关闭Android Jabber客户端的Wi-fi连接(数据)时,用户在服务器上被标记为离线的时间明显滞后了几分钟 我搞不清楚这两个过程的根本区别是什么 在场景2中可以做些什么使其立即脱机 场景1:当我向右滑动应用程序(杀死应用程序)时,用户立即在服务器上脱机。就在那一刻,它的状态变为离线
- 场景1:当我向右滑动应用程序(杀死应用程序)时,用户立即在服务器上脱机。就在那一刻,它的状态变为离线
- 场景2:然而,当我简单地关闭Android Jabber客户端的Wi-fi连接(数据)时,用户在服务器上被标记为离线的时间明显滞后了几分钟
onDestroy()时,该后台服务将维护到xmpp服务器的持久xmpp连接(TCP套接字)
将调用服务方法,在该方法中,可以检查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服务器,上给出的详细信息显示
如何检测死连接
检测死连接的一种方法是定期ping客户端
如果客户端没有响应,则终止连接。这可能是
使用mod_ping完成。但是,这些ping数据包可能会唤醒
客户端的无线电,因此短的ping间隔可能会耗尽移动电池。
因此,一般不建议使用小于
不到几分钟。不管怎样,总有一个时间窗口
消息可能会丢失