Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Jabber用户离线:为什么会出现两种不同的情况?_Android_Erlang_Xmpp_Ejabberd_User Presence - Fatal编程技术网

Android Jabber用户离线:为什么会出现两种不同的情况?

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:当我向右滑动应用程序(杀死应用程序)时,用户立即在服务器上脱机。就在那一刻,它的状态变为离线

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

意见:

  • 场景1:当我向右滑动应用程序(杀死应用程序)时,用户立即在服务器上脱机。就在那一刻,它的状态变为离线

  • 场景2:然而,当我简单地关闭Android Jabber客户端的Wi-fi连接(数据)时,用户在服务器上被标记为离线的时间明显滞后了几分钟

我搞不清楚这两个过程的根本区别是什么

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

场景1:当我向右滑动应用程序(杀死应用程序)时,用户立即在服务器上脱机。就在那一刻,它的状态变为离线

在上述情况下,在关闭Android应用程序之前,您的Android xmpp客户端将状态发送为不可用,可能您的Android xmpp客户端正在维护后台服务,当您关闭应用程序
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间隔可能会耗尽移动电池。 因此,一般不建议使用小于 不到几分钟。不管怎样,总有一个时间窗口 消息可能会丢失