gpt4 book ai didi

XMPP 接收发送到不同资源的消息

转载 作者:行者123 更新时间:2023-12-04 06:34:00 25 4
gpt4 key购买 nike

如何接收发送到不同资源的 XMPP 聊天消息?

例如。我的消息监听器可以正常接收消息,直到该消息从另一个资源(如 Gmail Google Talk)得到回复。从那时起,消息将发送到该客户端资源而不是我的监听器。

我正在使用 Smack Java 库(实际上是 asmack,它是 Android 的一个端口)

连接到服务(Google Talk 服务器)后,我添加了一个监听器,如下所示:

    connection.addPacketListener(new PacketListener() {

public void processPacket(Packet packet) {
Log.i(TAG, "processPacket: chat");

Message message = (Message) packet;

Log.d(TAG, "Message: " + message.toXML());

if (message.getBody() != null) {
String fromName = StringUtils.parseBareAddress(message.getFrom());
Log.i(TAG, "Got text [" +
message.getBody() +
"] from [" +
fromName +
"]");
}
}
}, filter);

这最初工作正常,我收到来自 Google Talk 的消息。这些消息实际上会发送到多个客户端、我的桌面 Google Talk、Google Talk 应用程序和 Android 以及我的实现。

但是当我回复一条消息时,比如说在桌面应用程序中,所有后续消息都被发送到桌面应用程序资源,而我在我的实现中什么也没收到。

所以我不确定如何也接收这些消息。 Google Talk 应用程序似乎可以做到这一点。它不像最初(在回复之前)那样显示为新消息,但它确实在 Google Talk 应用程序线程中得到更新。

任何帮助都会很棒!

最佳答案

如果我的理解正确,那么您在不同的应用程序(资源)上使用同一用户登录。您收到来自您名册中联系人的消息,但是当您从一个地方回复时,它会在这两个节点之间创建对话?

这是特定于实现的。大多数客户端都遵循 RFC 3921 中的推荐行为。 ,即回复完整的JID (user@domain/resource) 如果收到的消息来自完整的 JID。您可以自由地使用您的 from 作为您的裸 JID(用户@域)进行回复,以便将来按顺序向您的裸 JID 发送响应,从而使您所有可用的资源(假设优先级相等)都收到它。

从您从桌面应用程序回复的示例中,应用程序可能会将其“发件人” header 设置为完整的 JID,然后从您的桌面应用程序接收回复的另一方将该值用作“收件人”其响应的 header 。这当然意味着只有唯一的资源才能获得消息。

因此,它与您的代码无关。它与该桌面应用程序中的代码有关,与另一个端点(您正在与之交谈的伙伴)的代码一起工作,这将您的实现从循环中解脱出来。

关于XMPP 接收发送到不同资源的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5048092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com