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

StackOverflow https://stackoverflow.com/questions/4133897

  •  30-09-2019
  •  | 
  •  

Вопрос

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

 // 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 Samples, но мой код совершенно одинаковы, за исключением того, что я не создаю встроенную входную реализацию PacketListener.

Это было полезно?

Решение

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

Другие советы

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

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

Просто немного смущен. Ты говоришь

Верхние коды - это Smack Samples, но мой код совершенно одинаковы, за исключением того, что я не создаю встроенную входную реализацию PacketListener.

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

Чат newchat = Chatmanager.createChat ("jsmith@jivesoftware.com", new MessageListener () {public void processmessage (чат, сообщение сообщением) {System.out.println ("Полученное сообщение:" + Message);}});

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top