XMPP Невозможно настроить прослушиватель

1

Я успешно подключился к 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>

И сообщение "тест" отображается на подключенном пользовательском тесте (в данном случае). Я отправляю сообщение от пользователя eleano. Мы также видим, что на экране отображается отладочный вывод "Окончательный сеанс игры в пользовательский тест @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 никогда не вызывается. Почему это? Я правильно настроил его, как говорится в документации.

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

Теги:
debugging
xmpp
smack

3 ответа

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

Возможно, вы можете убедиться, что thread 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);

         }
}
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню