2011-02-14 55 views
23

我阅读了一些例子并测试了它们,但是他们都需要先与某人开始聊天以接收传入消息......我想要检索此传入消息,而无需先与jid交谈,任何人都可以举个例子吗?如何使用Smack接收传入的XMPP消息?

+0

你是什么服务器? – 2016-04-26 13:24:49

回答

29

您需要注册一个ChatListener通知新的聊天记录,那么你可以添加一个消息监听器,他们像正常:

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 hi! thx为你的回复:)请给一个完整的例子?我真的很麻烦:S – Winter 2011-02-14 17:00:35

+0

非常有用! addChatListener在登录之前可以调用的信息。 – h3xStream 2011-04-22 04:04:01

+1

我使用了相同的方法,但离线消息没有按顺序收到。我该如何解决这个问题? – Max 2013-07-24 16:33:55

15

我只是想添加复制&粘贴示例:

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

本示例连接到jabber.org并在控制台上显示每条收到的消息。

9

请找到下面的代码。
请smack.jar & smackx.jar添加到您的构建路径

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

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