使用 Smack 从 2 个不同的 android 设备登录到同一个 jabber 帐户

Posted

技术标签:

【中文标题】使用 Smack 从 2 个不同的 android 设备登录到同一个 jabber 帐户【英文标题】:Logging into same jabber account from 2 different android devices using Smack 【发布时间】:2010-08-03 21:14:24 【问题描述】:

我在 android 上开发了一个应用程序,它使用 Smack API 连接到 XMPP 服务器。在这个应用程序中,我硬编码了用户登录信息,即用户名和密码。

xmpp.login("admin", "tigase");

我从另一个用户那里得到数据包

PacketFilter 过滤器 = 新 和过滤器(新 PacketTypeFilter(Message.class), 新的 FromContainsFilter("ameya@mwbn43-1"));

现在我面临的问题是,当我在 2 台不同的 android 设备上运行相同的应用程序时,一台设备会覆盖其他设备的凭据,因此当我尝试发送数据时,只有其中一台会得到它。 AFAIK 在普通的 Google Chat 中,用户可以从 2 个不同的地方登录同一个帐户,并且可以同时在两个地方接收消息。

谁能告诉我可能是什么问题?它与 Smack API 有关吗?

谢谢,

阿米娅

【问题讨论】:

【参考方案1】:

登录时需要设置不同的资源

xmpp.login("admin", "tigase", "a random string here");

资源在概念上类似于 TCP 端口。请参阅此link。资源字符串用于区分设备登录到同一帐户的方式,即。例如,在桌面上,资源可能是 Android 上的“桌面”和“安卓”。但在您的情况下,您有 2 个 Android 设备,因此您无法预设资源。您可能希望在 Android 设备上使用唯一标识符字符串,例如帐户名称或 IMEI 号码。

使用资源字符串,您可以发送给特定用户,例如

admin@server/12345 

其中 12345 是您的资源或

admin@server

所有登录用户。

如果您的应用程序中没有使用资源字符串,您可以使用StringUtils.randomString(20) 生成20 个字符的随机字符串。 StringUtils 可以在 Smack 包中找到。

【讨论】:

@Chuk Lee : 如何防止其他用户登录同一个帐户,您有解决方案吗【参考方案2】:

作为一般规则,jabber 消息会发送到最后连接到服务器的设备,所以如果您正在连接

你的用户@yourserver.org

来自两个不同的设备,稍后连接的将是接收消息的那个。

但是,如果您指定资源,那么一切都会变得更容易,因此,假设您通过笔记本电脑和手机连接,那么您可以使用资源使用完整的 jid(jabber id)登录。

youruser@yourserver.org/laptop

youruser@yourserver.org/cellphone

现在,如果您想发送一条由您的手机连接的客户端专门接收的 jabber 消息,只需确保将消息发送到“youruser@yourserver.org/cellphone”而不是“youruser@yourserver” .org”

【讨论】:

【参考方案3】:

您只能将项目发送到一个设备而不是两个设备的原因是 Tigase 与 Google Chat 不同,它遵循 XEP 并将消息发送到具有最低优先级的连接(或者发送到最后登录的设备,如果优先级相同。)

在尝试将 JID 绑定到特定资源时需要小心,并确保您请求的资源已被实际分配。服务器可能不会将其提供给您,因为它与现有 JID 定义的资源冲突。

Google 聊天服务器做了一些“特殊”的事情,因为它们将消息传递到任何连接的 JID,而不管资源或优先级设置如何。有人建议进行一些更改,以允许按设计实现该行为,但 XSF 尚未接受这些更改。

如果您想将消息传递到所有连接的设备,我建议您考虑在 Tigase 服务器上创建一个 PubSub 节点并将该节点设置为传递到任何在线 JID - 然后您的所有设备都会收到您发送的任何消息如果他们在线,则推送到节点。

【讨论】:

请注意,使用新的XMPP RFC this behavior is now an option。所以 Google Talk 遵循规范。

以上是关于使用 Smack 从 2 个不同的 android 设备登录到同一个 jabber 帐户的主要内容,如果未能解决你的问题,请参考以下文章

Smack android传入的onStanza与调试器不同

如何使用 Smack 从 android 客户端获取 openfire 在线注册用户?

如何在 Android 应用中使用 Smack 从 Openfire 服务器恢复两个用户之间的聊天记录

Smack Android 客户端无法连接到 ejabberd 服务器

在 Android Studio 上使用 Smack 构建 XML 流消息

在android中使用Smack的ejabberd连接给出连接超时错误