2011-12-23 2 views
1

Я успешно подключился к XMPP-серверу (от клиента android XMPP), и я могу отправлять сообщения пользователю, но я не могу получать ответы от этого же пользователя.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. Класс The 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 [email protected]( 823): 0 
D/SMACK ( 823): 10:43:54 AM SENT (1156346368): <message id="vwaJX-15" to="[email protected]" from="[email protected]lhost/Smack" type="chat"><body>test</body><thread>249ke0</thread></message> 
D/SMACK ( 823): 10:43:54 AM RCV (1156346368): <presence id="vwaJX-12" to="[email protected]/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="[email protected]/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> 

и сообщение «тест» отображаются для тестирования подключенного пользователя (в Это дело). Я отправляю сообщение от пользователя eleano. Мы также видим, что на экране отображается отладочный вывод «Конечная игра для пользователя в пользовательский тест @ localhost», что указывает на то, что моя функция действительно называется успешно.

После получения сообщения от теста к eleano, я только получаю этот отладочный вывод:

D/SMACK ( 823): 10:44:00 AM RCV (1156346368): <message id="58Fjj-64" to="[email protected]/Smack" from="[email protected]/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 никогда не вызывается. Почему это? Я правильно настроил его, как говорится в документации.

Любые идеи приветствуются. И спасибо.

ответ

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); 

И это работает. Я могу отправлять сообщения пользователю и получать их просто отлично.

0

Ваша проблема в том, что сообщение из теста имеет другой идентификатор потока. Это соответствует сообщению, принадлежащему другому чату. Если вы создадите ChatManagerListener, он будет вызван с новым чатом, когда он будет создан. Я не уверен, почему ответное сообщение будет иметь другой идентификатор потока.

Обычно беседа координируется идентификатором потока. Это позволяет использовать несколько параллельных разговоров между двумя пользователями. При этом некоторые клиенты вообще не используют идентификатор потока. В этом случае Smack будет сопоставлять входящее сообщение чата с существующим с тем же JID, если он уже существует, или создать новый, если это не так.