Question

J'utilise le code ci-dessous pour envoyer des messages.

 // 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");
}

Et ci-dessous pour recevoir les messages envoyés à mon jabberId, de manière asynchrone.

// 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);

Envoi du message est ok.

Mais la réception du message d'un autre jabberId n'achived jusqu'à ce que j'envoyer un message à cette jabberId.

Et après que je reçois des messages envoyés par correctement.

Notez que j'ai souvent besoin de recevoir des messages de jabberIDs qui ne sont pas dans ma liste et souvent Mon application n'est pas le côté qui commence une conversation.

codes supérieurs sont des échantillons Smack mais mon code est tout à fait même sauf que je ne crée pas la mise en œuvre PacketListener en ligne.

Était-ce utile?

La solution

Mon problème résolu lorsque je me suis arrêté à l'aide du client Jabber avec le même utilisateur logined pendant que je teste mon programme. En d'autres mots de code est correct, mais les prises de clients Jabber a envoyé des messages et restent pas des choses pour mon programme pour attraper.

Autres conseils

Il a été un bon moment que je travaille avec smack, mais je réussi à lancer des discussions en fonction des messages entrants.

Si je me souviens bien, j'ai eu une sorte de « ChatRegistry », un simple Map<String, Chat> où la clé était égale à l'identifiant de partenaires de chat. Puis j'ai écouté les messages entrants, l'extrait id Jabber et regardé la séance de discussion active avec ce partenaire. S'il n'y avait pas une session active, j'ai créé un nouveau chat et a ajouté la nouvelle paire de clés / vale au Registre.

Juste un peu confus. Vous dites

  

codes supérieurs sont des échantillons Smack mais mon code est tout à fait même sauf que je ne crée pas la mise en œuvre PacketListener en ligne.

Comment recevoir des messages sans avoir une implémentation PacketListener? Je pense que vous toujours recevoir des messages de chats que vous avez commencé à cause du code ci-dessous

  

Bavardage newChat = chatmanager.createChat ( "jsmith@jivesoftware.com", nouvelle MessageListener () {       ProcessMessage public void (Chat chat, un message du message) {           System.out.println ( "message Received:" + message);       }   });

Mais pour attendre les messages de manière asynchrone entrants, je pense que vous aurez besoin d'un PacketListener. Je pourrais avoir totalement mal compris le problème que vous rencontrez si

(Cela aurait dû être un commentaire, mais je ne peux pas comprendre comment ajouter un)

Il a été un certain temps, avez-vous réussi à résoudre ce problème? Pourquoi créer vous FromContainsFilter? De cette façon, vos auditeurs traite uniquement les paquets de l'utilisateur donné, et non pas tous les paquets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top