2011-02-14 8 views
23

He leído algunos ejemplos y los he probado, pero todos ellos necesitan iniciar un chat con alguien primero para recibir mensajes entrantes ... Quiero recuperar estos mensajes entrantes sin necesidad de hablar primero con el jid. ¿Alguien puede dar un ejemplo?Cómo recibir mensajes entrantes de XMPP usando Smack?

+0

¿cuál es su servidor? –

Respuesta

29

Debe registrarse un ChatListener a ser notificado de nuevos chats, a continuación, se puede añadir un escucha de mensajes a ellos como 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 ¡Hola! THX para su respuesta :) podría por favor dar un ejemplo completo? Estoy realmente en problemas: S – Winter

+0

¡muy útil! para la información, se puede llamar a addChatListener antes del inicio de sesión. – h3xStream

+1

He usado el mismo enfoque, pero los mensajes fuera de línea no se reciben en orden. ¿Cómo puedo resolver esto? – Max

15

i sólo quería añadir una copia de muestra & pegar:

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

Este ejemplo se conecta a jabber.org y muestra todos los mensajes recibidos en la consola.

+0

Estoy haciendo lo mismo, pero no puedo recibir el mensaje. Hay una publicación en el blog. Explico qué está pasando con mi código. http://www.rmwaqas.com/chat-client-using-smack/ – Waqas

9

Encuentra el siguiente código.
Por favor, añadir smack.jar & smackx.jar a su trayectoria de la estructura

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

Me ayudó mucho :) –

+0

@Samik desde donde se encuentra este archivo smack.jar & smackx.jar tengo dolwoad smack_4_1_3.zip pero no puedo encontrar este archivo jar dos – 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

Hola @TheMan Tu respuesta me ayudó mucho. El método anterior se llama a processPacket cuando envío un mensaje al usuario, pero si el usuario responde a mi mensaje, ¿esto no se llama getting? Por favor ayuda ... –

+0

Debería ser llamado. No estoy seguro de por qué no está funcionando para ti. – TheMan

+2

Hola @TheMan si quieres el mensaje del oyente de grupo, entonces deberías ** agregarPacketListner ** a ** conexión ** –

Cuestiones relacionadas