3

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

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

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

PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class), new FromContainsFilter("ameya@mwbn43-1"));

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

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

谢谢,

阿美谷

4

3 回答 3

8

您需要做的是在登录时设置不同的资源

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

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

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

admin@server/12345 

其中 12345 是您的资源或

admin@server

给所有登录用户。

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

于 2010-08-04T02:57:44.877 回答
5

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

youruser@yourserver.org

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

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

youruser@yourserver.org/laptop

youruser@yourserver.org/cellphone

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

于 2012-08-22T07:53:45.743 回答
3

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

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

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

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

于 2010-08-13T16:36:01.610 回答