如何使用Smack接收XMPP传入消息?

24

我阅读了一些示例并进行了测试,但所有示例都需要先与某人开始聊天才能接收到传入的消息... 我想在不需要先向jid发送消息的情况下检索传入的消息,有人可以给出一个例子吗?


你的服务器是什么? - Sagar Nayak
4个回答

30

你需要注册一个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,嗨!谢谢您的回复 :) 能否给一个完整的例子吗?我真的很困扰 :S - Winter
非常有用!关于addChatListener的信息,可以在登录之前调用。 - h3xStream
1
我使用了相同的方法,但离线消息没有按顺序接收。我该如何解决这个问题? - Max
1
@Chris Smith,我已经创建了一个房间并添加了两个用户,能够向房间发送消息。现在我想接收其他用户发送的消息...如何实现这一点...???使用此API是否可能? - KK_07k11A0585

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并在控制台上显示每个接收到的消息。


我正在做同样的事情,但无法接收消息。我在一篇博客文章中解释了我的代码发生了什么。 http://www.rmwaqas.com/chat-client-using-smack/ - Waqas

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("youtID@sample.com", "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"));
            }
        }
    }

}

@Samik,你从哪里找到这个smack.jar和smackx.jar文件的?我下载了smack_4_1_3.zip,但是没有找到这两个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              
            }
        });
    }

嗨@TheMan,你的答案帮了我很多。上面的方法processPacket在我向用户发送消息时被调用,但如果用户回复我的消息,则不会被调用?请帮忙... - KK_07k11A0585
它应该被调用。我不确定为什么它对你不起作用。 - TheMan
2
嗨@TheMan,如果你想要群组消息的监听器,那么你应该将addPacketListener添加到connection - KK_07k11A0585
你如何检测它是传入还是传出的,因为在最新版本中似乎是相似的消息对象。 - Shubham AgaRwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接