Проблема в получении первого сообщения от Smack - PullRequest
0 голосов
/ 09 ноября 2010

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

 // 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.

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

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

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

Ответы [ 4 ]

3 голосов
/ 22 ноября 2010

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

0 голосов
/ 29 июля 2011

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

0 голосов
/ 11 ноября 2010

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

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

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

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

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

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

0 голосов
/ 09 ноября 2010

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

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

...