2011-02-14 3 views
23

J'ai lu quelques exemples et les ai testés mais tous doivent commencer à discuter avec quelqu'un d'abord pour recevoir des messages entrants ... Je veux récupérer ces messages entrants sans avoir besoin de parler d'abord au jid qui peut donner un exemple?Comment recevoir des messages XMPP entrants à l'aide de Smack?

+0

quel est votre serveur? –

Répondre

29

Vous devez enregistrer un ChatListener pour être informé de nouveaux chats, vous pouvez ajouter un écouteur de message à eux comme normal:

connection.getChatManager().addChatListener(new ChatManagerListenerImpl()); 

.... 

private class ChatManagerListenerImpl implements ChatManagerListener { 

    /** {@inheritDoc} */ 
    @Override 
    public void chatCreated(final Chat chat, final boolean createdLocally) { 
     chat.addMessageListener(...); 
    } 

} 
+1

@cris Smith salut! Merci pour votre réponse :) pourrait s'il vous plaît donner un exemple complet? Je suis vraiment en difficulté: S – Winter

+0

très utile! Pour les informations, le addChatListener peut être appelé avant la connexion. – h3xStream

+1

J'ai utilisé la même approche, mais les messages hors ligne ne sont pas reçus dans l'ordre. Comment puis-je résoudre ça? – Max

15

je voulais juste ajouter un échantillon de pâte de copie &:

// connect to server 
    XMPPConnection connection = new XMPPConnection("jabber.org"); 
    connection.connect(); 
    connection.login("user", "password"); // TODO: change user and pass 

    // register listeners 
    ChatManager chatmanager = connection.getChatManager(); 
    connection.getChatManager().addChatListener(new ChatManagerListener() 
    { 
    public void chatCreated(final Chat chat, final boolean createdLocally) 
    { 
     chat.addMessageListener(new MessageListener() 
     { 
     public void processMessage(Chat chat, Message message) 
     { 
      System.out.println("Received message: " 
      + (message != null ? message.getBody() : "NULL")); 
     } 
     }); 
    } 
    }); 

    // idle for 20 seconds 
    final long start = System.nanoTime(); 
    while ((System.nanoTime() - start)/1000000 < 20000) // do for 20 seconds 
    { 
    Thread.sleep(500); 
    } 
    connection.disconnect(); 

Cet exemple se connecte à jabber.org et affiche tous les messages reçus sur la console.

+0

Je fais la même chose, mais incapable de recevoir le message. Il y a un billet de blog que j'explique ce qui se passe avec mon code. http://www.rmwaqas.com/chat-client-using-smack/ – Waqas

9

Veuillez trouver le code suivant.
S'il vous plaît ajouter smack.jar & smackx.jar à votre chemin de construction

import org.jivesoftware.smack.ConnectionConfiguration; 
import org.jivesoftware.smack.PacketCollector; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.filter.AndFilter; 
import org.jivesoftware.smack.filter.PacketFilter; 
import org.jivesoftware.smack.filter.PacketTypeFilter; 
import org.jivesoftware.smack.packet.Message; 
import org.jivesoftware.smack.packet.Packet; 

public class GoogleTalkDemo extends Thread{ 
    private XMPPConnection xmppConnection; 

    public void connect(String server, int port, String s) throws Exception { 
     xmppConnection = new XMPPConnection(new ConnectionConfiguration(server, port,s)); 
     xmppConnection.connect(); 
    } 

    public void disconnect(){ 
     if(xmppConnection != null){ 
      xmppConnection.disconnect(); 
      interrupt(); 
     } 
    } 

    public void login(String username, String password) throws Exception{ 
     connect("talk.google.com", 5222, "gmail.com"); 
     xmppConnection.login(username, password); 
    } 

    public void run(){ 
     try { 
      login("[email protected]", "your password"); 
      System.out.println("Login successful"); 
      listeningForMessages(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String args[]) throws Exception { 
     GoogleTalkDemo gtd = new GoogleTalkDemo(); 
     gtd.run(); 
    } 

    public void listeningForMessages() { 
     PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class)); 
     PacketCollector collector = xmppConnection.createPacketCollector(filter); 
     while (true) { 
      Packet packet = collector.nextResult(); 
      if (packet instanceof Message) { 
       Message message = (Message) packet; 
       if (message != null && message.getBody() != null) 
        System.out.println("Received message from " 
          + packet.getFrom() + " : " 
          + (message != null ? message.getBody() : "NULL")); 
      } 
     } 
    } 

} 
+1

Il m'a beaucoup aidé :) –

+0

@Samik d'où vous trouvez ce fichier smack.jar & smackx.jar j'ai dolwoad smack_4_1_3.zip mais je ne peux pas trouver ce fichier de deux jar – PankajAndroid

3
private MultiUserChat muc; /* Initialize muc */ 

private void listeningForMessages() 
    { 
     muc.addMessageListener(new PacketListener() { 
      public void processPacket(Packet packet) 
      { 
       final Message message = (Message) packet; 

        // Do your action with the message    
      } 
     }); 
    } 
+0

Salut @TheMan Votre réponse m'a beaucoup aidé. La méthode ci-dessus processPacket est appelée quand j'envoie un message à l'utilisateur mais si l'utilisateur répond à mon message, alors cela n'est pas appelé ?? Plz aide ... –

+0

Il devrait être appelé. Je ne sais pas pourquoi ça ne marche pas pour toi. – TheMan

+2

Salut @TheMan si vous voulez l'écouteur du message de groupe alors vous devriez ** addPacketListner ** à ** connexion ** –

Questions connexes