2010-11-09 6 views
0

J'utilise le code ci-dessous pour envoyer des messages.Problème lors de la réception du premier message par Smack

// Assume we've created an XMPPConnection name "connection". 
ChatManager chatmanager = connection.getChatManager(); 
Chat newChat = chatmanager.createChat("[email protected]", 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 la réception de 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("[email protected]")); 
// 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); 

Le message d'envoi est correct.

Mais la réception d'un message d'un autre JabberID ne se termine pas avant que j'aie envoyé un message à ce JabberID.

Et après cela, je reçois les messages envoyés correctement.

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

Les codes supérieurs sont des échantillons cliquables mais mon code est complètement identique sauf que je ne crée pas l'implémentation de PacketListener en ligne.

+0

Pendant que je réfléchis à votre problème, jetez un œil à [déboguer avec smack] (http://www.igniterealtime.org/builds/smack/docs/latest/documentation/debugging.html). J'ai été capable de résoudre presque tous les problèmes après que simlpy ait allumé le débogueur ;-) –

+0

Votre code est-il complet? Je ne fais aucune invocation à myCollector.nextPacket() ... – mschonaker

Répondre

3

Mon problème résolu lorsque je me suis arrêté à l'aide du client Jabber avec le même utilisateur connecté pendant que je teste mon programme. En d'autres termes, le code est correct, mais le client Jabber attrape les messages envoyés et ne garde aucune chose à saisir pour mon programme.

+0

Veuillez marquer votre question comme réponse. :) – Flow

0

Cela fait un certain temps que je travaillais avec smack, mais j'ai réussi à lancer des discussions basées sur les messages entrants. Si je me souviens bien, j'avais une sorte de "ChatRegistry", un Map<String, Chat> simple où la clé était égale à l'ID de partenaires de discussion. J'ai ensuite écouté les messages entrants, extrait l'identifiant jabber et recherché la session de discussion active avec ce partenaire. S'il n'y avait pas de session active, j'ai créé un nouveau chat et ajouté la nouvelle paire clé/valise au registre.

+0

Je pense qu'il y a une mauvaise boucle – mjafari

+0

Je n'ai pas trouvé ChatRegistry ou quelque chose comme ça et je pense qu'il y a une mauvaise boucle dans votre suggestion: si je sais qui veut m'envoyer un message alors aucun problème n'existe. – mjafari

0

Juste un peu confus. Vous dites

Les codes supérieurs sont des échantillons smack mais mon code est complètement identique sauf que je ne crée pas l'implémentation de PacketListener en ligne.

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

chat newChat = chatmanager.createChat ("[email protected]", nouvelle MessageListener() {public void ProcessMessage (Chat chat, message message) { System.out.println ("Message reçu:" + message); } });

Mais pour attendre de manière asynchrone les messages 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)

+0

1. J'implémente PacketListener mais pas en ligne – mjafari

0

Cela fait longtemps, avez-vous réussi à résoudre ce problème? Pourquoi créez-vous FromContainsFilter? De cette façon, vos écouteurs ne traitent que les paquets de l'utilisateur donné, pas tous les paquets.

Questions connexes