XMPP Невозможно настроить прослушиватель - PullRequest
1 голос
/ 23 декабря 2011

Я успешно подключился к XMPP-серверу (из XMPP-клиента Android) и могу отправлять сообщения пользователю, но не могу получать ответы от этого же пользователя.

Я отправляю сообщениявот так:

  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 никогда не вызывается.Это почему?Я настроил его правильно, как сказано в документации.

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

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

Спасибо за указание на это.Ваши наблюдения привели меня к настройке прослушивателя при подключении (и прослушиванию пакетов типа 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 голосов
/ 26 июня 2018

Может быть, вы могли бы удостовериться, что идентификатор потока выглядит так:

0 голосов
/ 23 декабря 2011

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

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

...