我已成功连接到XMPP服务器(来自android XMPP客户端),我可以向用户发送消息,但我无法收到同一用户的响应。
我正在发送这样的消息:
public void send_message(String message, String buddy) throws XMPPException {
buddy += "@localhost";
/* send message to user */
Log.w("Sending mesage " + message + " to user " + buddy, "0");
chat = chatManager.createChat(buddy, messageListener);
chat.sendMessage(message);
}
我正在将messageListener传递给createChat函数。 MessageListener的类是:
class XMPPMessageListener implements MessageListener {
private String from;
private String body;
public void processMessage(Chat chat, Message message) {
this.from = message.getFrom();
this.body = message.getBody();
Log.w("*****Received message" + body + " from " + from, "0*****");
}
}
向用户发送消息时,我收到以下调试信息:
W/Sending mesage play to user test@localhost( 823): 0
D/SMACK ( 823): 10:43:54 AM SENT (1156346368): <message id="vwaJX-15" to="test@localhost" from="eleano@localhost/Smack" type="chat"><body>test</body><thread>249ke0</thread></message>
D/SMACK ( 823): 10:43:54 AM RCV (1156346368): <presence id="vwaJX-12" to="eleano@localhost/Smack" from="eleano" type="error"><error code="404" type="cancel"><remote-server-no
D/SMACK ( 823): 10:43:54 AM RCV (1156346368): t-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></presence>
D/SMACK ( 823): 10:43:54 AM RCV (1156346368): <presence id="vwaJX-14" to="eleano@localhost/Smack" from="test" type="error"><error code="404" type="cancel"><remote-server-not-
D/SMACK ( 823): 10:43:54 AM RCV (1156346368): found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></presence>
并且连接的用户测试(在这种情况下)显示消息“test”。我正在发送用户eleano的消息。我们还可以看到屏幕上显示的调试输出“结束消息到用户test @ localhost”,表明我的功能确实被成功调用。
收到test to eleano的消息后,我只得到这个调试输出:
D/SMACK ( 823): 10:44:00 AM RCV (1156346368): <message id="58Fjj-64" to="eleano@localhost/Smack" from="test@localhost/Spark 2.6.3" type="chat"><body>yes</body><thread>0tlK7o<
D/SMACK ( 823): 10:44:00 AM RCV (1156346368): /thread><x xmlns="jabber:x:event"><offline/><composing/></x></message>
但是用户eleano没有收到该消息。我们也可以注意到没有:
Log.w("*****Received message" + body + " from " + from, "0*****");
显示在屏幕上,因此永远不会调用MessageListener。这是为什么?我按照文档中的说法正确设置了它。
欢迎任何想法。谢谢。
答案 0 :(得分:1)
感谢你指出这一点。你的观察让我在连接上设置了一个监听器(并监听Char类型的包),而不是在聊天对象本身上设置一个监听器。
现在我的代码如下所示。我发送这样的包裹:
Message m = new Message(buddy, Message.Type.chat);
m.setBody(message);
connection.sendPacket(m);
并收到如下消息:
/* packet listener: listen for incoming messages of type CHAT on the connection (whatever the buddy) */
PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
xmppManager.connection.addPacketListener(new PacketListener() {
public void processPacket(Packet packet) {
Message mes = (Message)packet;
Log.w("***"+mes.toString()+"***","0");
}
}, filter);
它有效。我可以向用户发送消息并接收它们。
答案 1 :(得分:0)
您的问题是来自test的消息具有不同的线程ID。这相当于属于不同聊天的消息。如果您创建了一个ChatManagerListener,它将在创建时使用新的Chat进行调用。我不知道为什么回复消息会有不同的线程ID。
通常,会话由线程ID协调。这允许两个用户之间的多个并发对话。话虽这么说,一些客户端根本不使用线程ID。在这种情况下,Smack会将传入的聊天消息与具有相同JID的现有聊天消息(如果已存在)匹配,或者如果不存在则创建新消息。
答案 2 :(得分:0)
也许您可以确保这样的线程ID:
public void processMessage(Chat chat, Message message) {
UserData user = null;
MessageData m = null;
if (message.getType() == Message.Type.chat &&
(!message.getThread().equals(tempID))) {
user = model.findUserByAccountName(chat.getParticipant());
m = new MessageData(user, message.getBody());
model.receiveMessage(user.getFriendOf(), m);
}
}