Jabber 用户下线:为什么是两种不同的情况?

Jabber user going offline: Why the two different scenarios?

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

观察:

我无法弄清楚这两个过程的根本区别是什么。

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

Scenario 1: When I swipe-right the app (kill the app), the user goes offline on the server immediately. Its status is changed to offline at that very instant.

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

Scenario 2: However, when I simply shut-down the Wi-fi connectivity (data) of my Android Jabber client, there is a noticeable lag of a few minutes for the user to be marked offline on the server.

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

What could be done in Scenario 2 to make it go offline immediately?

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

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

据我所知,您正在使用 ejabberd 作为您的 XMPP 服务器,this link 上给出的详细信息说,

How to detect a dead connection?

One way to detect a dead connection is to ping the client periodically and to kill the connection if the client doesn't respond. This can be done using mod_ping. However, these ping packets might wake up the client's radio, so a short ping interval might drain mobile batteries. Therefore, it's not generally recommended to use an interval of less than a few minutes. Either way, there's always some time window where messages can be lost.