当使用XMPP时,如何检测用户(JID)是否已在登录时登录?

5
在我的聊天应用程序中,我想实现这样一种功能:当用户已经登录并且希望在另一台设备上使用相同的用户名和密码进行登录时,应向用户返回一条消息 -“您已经在其他地方登录”。
我只知道这种检查登录状态的方法 -
connection.isConnected();

但这并不能满足我的目的。
2个回答

4

Alex的答案是正确的,但我想稍微详细解释一下:

在成功登录后,您的XMPP-IM客户端将向服务器发送一个出席(presence)信息。然后,服务器会回复每个JID在您的花名册中的出席信息,并标记它们的订阅状态为“from”和“both”(RFC6121 XMPP-IM 4.2.2和4.4.2)。

第4.4.2节还指出:

The user's server MUST also send the presence stanza to all of the user's 
available resources (including the resource that generated the presence
notification in the first place).

这意味着您将从JID的每个连接资源获取到存在信息。如果您在此处收到来自不同完整JID的存在节,则使用您当前连接所使用的第二个(或第三个,...)客户端连接了您的JID,并且会显示“您已经在其他地方登录”的消息。
请注意,在使用XMPP时,同时使用相同的裸JID连接的多个客户端是XMPP-IM的核心特性,这并不是您真正想要做的事情。
在使用Smack时,可以使用Iterator<Presence> Roster.getPresences(String user)检索存在信息。调用看起来像这样:getPresences(XMPPConnection.getUser())。(请注意,我没有验证它是否确实可行)。

3

登录后,当您发送初始存在时,您会收到所有其他资源(设备)的存在。因此,请检查所有传入的存在,您将知道所有可用的连接。


我知道我们可以获取所有其他连接,但如何管理那些已经连接的网络。我希望当用户已经连接时,应该收到一个弹出窗口,提示您已经在其他地方登录了。 - Gaurav Arora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接