5

在我的聊天应用程序中,我想实现一个功能,每当用户已经登录并且如果他/她想使用相同的用户名和密码再次登录其他设备时,它应该将用户回复一条消息 - “你是已经在其他地方登录”

我只知道这种检查登录状态的方法-

connection.isConnected();

但这不会满足我的目的。

4

2 回答 2

4

亚历克斯的回答是正确的,但让我稍微详细说明一下:

成功登录后,您的 XMPP-IM 客户端将向服务器发送一个出席信息节。然后,服务器以订阅状态“来自”和“两者”(RFC6121 XMPP-IM 4.2.2和 4.4.2)的方式回复您名册中所有 JID 的存在节。

第 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())。(请注意,我尚未验证它是否真的有效)。

于 2013-01-31T11:47:31.303 回答
3

after login when you send your initial presence you get the presences of all your other resources (devices). So check all your incoming presences and you will know all your available connections.

于 2013-01-31T10:29:43.870 回答