【问题标题】:How to receive Incoming XMPP Messages using Smack?如何使用 Smack 接收传入的 XMPP 消息?
【发布时间】:2011-06-27 01:21:19
【问题描述】:

我阅读了一些示例并对其进行了测试,但是所有示例都需要先与某人开始聊天才能接收传入消息...我想检索此传入消息而无需先与 jid 交谈任何人都可以举个例子吗?

【问题讨论】:

  • 你的服务器是什么?

标签: xmpp smack


【解决方案1】:

您需要注册一个 ChatListener 以收到新聊天的通知,然后您可以像往常一样向它们添加消息侦听器:

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

....

private class ChatManagerListenerImpl implements ChatManagerListener {

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

}

【讨论】:

  • @cris Smith 嗨!谢谢你的回复:) 请举一个完整的例子吗?我真的有麻烦了:S
  • 非常有用!可以在登录前调用 addChatListener 的信息。
  • 我用了同样的方法,但是离线消息没有按顺序接收。我该如何解决这个问题?
  • @Chris Smith 我创建了一个房间并添加了 2 个用户,并且能够向房间发送消息。现在我想接收其他用户发送的消息......如何实现这个......?使用这个api可以吗??
【解决方案2】:

我只是想添加一个复制和粘贴示例:

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

【讨论】:

【解决方案3】:

请找到以下代码。
请将 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 文件我有 dolwoad smack_4_1_3.zip 但我找不到这两个 jar 文件
【解决方案4】:
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 但如果用户回复我的消息那么这不会被调用?请帮助...
  • 它应该被调用。我不确定为什么它不适合你。
  • 嗨@TheMan,如果你想要组消息的监听器,那么你应该 addPacketListnerconnection
  • 你如何检测它是传入还是传出,因为它似乎是最新版本中的类似消息对象
猜你喜欢
  • 2016-06-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 2017-06-18
相关资源
最近更新 更多