如何接收发送到其他资源的XMPP聊天消息?
E.g。我的邮件侦听器收到的邮件很好,直到该邮件被其他资源(如Gmail Google Talk)回复。从那时起,消息就被发送到该客户端资源而不是我的监听器。
我正在使用Java的Smack库(实际上,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应用程序主题中更新。
任何帮助都会很棒!
答案 0 :(得分:3)
如果我理解正确,您就可以在不同的应用程序(资源)上使用相同的用户登录。您收到来自名单中联系人的消息,但是当您从一个地方回复时,它会在这两个节点之间创建对话?
这是特定于实现的。大多数客户端都遵循RFC 3921中建议的行为,即如果收到的消息来自完整的JID,则回复完整的JID(用户@域/资源)。您可以使用从作为裸JID(用户@域)进行回复,以便将来的响应按顺序发送到您的裸JID,从而产生所有可用资源(假设优先级为等于接收它。
在您从桌面应用程序回复的示例中,应用程序可能正在将“From”标头设置为完整的JID,而从桌面应用程序接收回复的另一方则使用该值作为'To'标题为其回复。这当然意味着只有那个独特的资源才能获得消息。
所以它与你的代码无关。这与桌面应用程序中的代码有关,与另一个端点(你正在谈论的伙伴)的代码一起工作,这就是将你的实现从循环中删除。
答案 1 :(得分:0)
我认为您应该在xmpp中查找该问题的优先级设置。需要设置优先级设置,以便跨不同资源接收消息!
需要多个连接来控制消息流,因此需要设置优先级:以下是优先级的基本规则:在任何给定时间具有最高优先级的资源将是接收传入消息的资源。如果两个或多个资源具有相同的优先级,则具有所述优先级的所有资源将接收传入消息。如果所有连接的资源都具有负优先级,则传入的消息将在服务器端排队,直到其中一个资源将优先级重置为正数。
源:http://blog.roobix.net/2010/02/jabber-xmpp-resources-and-priorities.html