Проблема при получении первого сообщения с помощью Smack

#java #xmpp #smack

#java #xmpp #smack

Вопрос:

Я использую приведенный ниже код для отправки сообщений.

  // Assume we've created an XMPPConnection name "connection".
ChatManager chatmanager = connection.getChatManager();
Chat newChat = chatmanager.createChat("jsmith@jivesoftware.com", new MessageListener() {
    public void processMessage(Chat chat, Message message) {
        System.out.println("Received message: "   message);
    }
});

try {
    newChat.sendMessage("Howdy!");
}
catch (XMPPException e) {
    System.out.println("Error Delivering block");
}
  

И ниже для получения сообщений, отправленных на мой JabberID, асинхронно.

 // Create a packet filter to listen for new messages from a particular
// user. We use an AndFilter to combine two other filters.
PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class), 
        new FromContainsFilter("mary@jivesoftware.com"));
// Assume we've created an XMPPConnection name "connection".

// First, register a packet collector using the filter we created.
PacketCollector myCollector = connection.createPacketCollector(filter);
// Normally, you'd do something with the collector, like wait for new packets.

// Next, create a packet listener. We use an anonymous inner class for brevity.
PacketListener myListener = new PacketListener() {
        public void processPacket(Packet packet) {
            // Do something with the incoming packet here.
        }
    };
// Register the listener.
connection.addPacketListener(myListener, filter);
  

Отправка сообщения в порядке.

Но получение сообщения от другого JabberID не выполняется, пока я не отправлю сообщение на этот JabberID.

И после этого я получаю сообщения, отправленные им должным образом.

Обратите внимание, что мне часто нужно получать сообщения от jabberIDs, которых нет в моем списке, и часто мое приложение не является той стороной, которая начинает чат.

Верхние коды являются примерами smack, но мой код полностью такой же, за исключением того, что я не создаю встроенную реализацию PacketListener.

Комментарии:

1. Пока я размышляю над вашей проблемой, пожалуйста, внимательно посмотрите на отладку с помощью smack . Я смог решить почти все проблемы после того, как simlpy включил отладчик 😉

2. Завершен ли ваш код? У меня нет никакого вызова myCollector.nextPacket()…

Ответ №1:

Моя проблема решена, когда я перестал использовать Jabber Client с тем же пользователем, который входил в систему во время тестирования моей программы. Другими словами, код правильный, но клиент Jabber перехватывает отправленные сообщения, и моей программе ничего не удается перехватить.

Ответ №2:

Прошло довольно много времени с тех пор, как я работал с smack, но мне удалось запустить чаты на основе входящих сообщений.

Если я хорошо помню, у меня была какая-то «ChatRegistry», простая Map<String, Chat> , где ключ был равен идентификатору партнера по чату. Затем я прослушал входящие сообщения, извлек jabber id и посмотрел активную сессию чата с этим партнером. Если не было активного сеанса, я создал новый чат и добавил новую пару ключ / vale в реестр.

Комментарии:

1. Я не смог найти ChatRegistry или что-то подобное, и я думаю, что в вашем предложении неправильный цикл: если я знаю, кто хочет отправить мне сообщение, то проблем не существует.

Ответ №3:

Просто немного запутался. Вы говорите

Верхние коды являются примерами smack, но мой код полностью такой же, за исключением того, что я не создаю встроенную реализацию PacketListener.

Как вы получаете сообщения без реализации PacketListener? Я бы подумал, что вы всегда будете получать сообщения из чатов, которые вы запустили, из-за приведенного ниже кода

Чат newChat = chatmanager.createChat(«jsmith@jivesoftware.com «, new MessageListener() { public void ProcessMessage(чат-чат, сообщение о сообщении) { System.out.println(«Полученное сообщение: » сообщение); } });

Но для того, чтобы асинхронно ожидать входящих сообщений, я думаю, вам понадобится PacketListener. Возможно, я совершенно неправильно понял проблему, с которой вы столкнулись

(Это должен был быть комментарий, но я не могу понять, как его добавить)

Комментарии:

1. 1. Я реализую PacketListener, но не встроенный

Ответ №4:

Прошло некоторое время, вам удалось это решить? почему вы создаете FromContainsFilter? Таким образом, ваши слушатели обрабатывают только пакеты от данного пользователя, а не все пакеты.