XMPP无法设置监听器

时间:2011-12-23 10:01:33

标签: java android debugging xmpp smack

我已成功连接到XMPP服务器(来自android XMPP客户端),我可以向用户发送消息,但我无法收到同一用户的响应。

我正在发送这样的消息:

  public void send_message(String message, String buddy) throws XMPPException {
    buddy += "@localhost";

    /* send message to user */
    Log.w("Sending mesage " + message + " to user " + buddy, "0");
    chat = chatManager.createChat(buddy, messageListener);
    chat.sendMessage(message);
  }

我正在将messageListener传递给createChat函数。 MessageListener的类是:

class XMPPMessageListener implements MessageListener {
  private String from;
  private String body;

  public void processMessage(Chat chat, Message message) {
    this.from = message.getFrom();
    this.body = message.getBody();
    Log.w("*****Received message" + body + " from " + from, "0*****");
  }

}

向用户发送消息时,我收到以下调试信息:

W/Sending mesage play to user test@localhost(  823): 0
D/SMACK   (  823): 10:43:54 AM SENT (1156346368): <message id="vwaJX-15" to="test@localhost" from="eleano@localhost/Smack" type="chat"><body>test</body><thread>249ke0</thread></message>
D/SMACK   (  823): 10:43:54 AM RCV  (1156346368): <presence id="vwaJX-12" to="eleano@localhost/Smack" from="eleano" type="error"><error code="404" type="cancel"><remote-server-no
D/SMACK   (  823): 10:43:54 AM RCV  (1156346368): t-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></presence>
D/SMACK   (  823): 10:43:54 AM RCV  (1156346368): <presence id="vwaJX-14" to="eleano@localhost/Smack" from="test" type="error"><error code="404" type="cancel"><remote-server-not-
D/SMACK   (  823): 10:43:54 AM RCV  (1156346368): found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></presence>

并且连接的用户测试(在这种情况下)显示消息“test”。我正在发送用户eleano的消息。我们还可以看到屏幕上显示的调试输出“结束消息到用户test @ localhost”,表明我的功能确实被成功调用。

收到test to eleano的消息后,我只得到这个调试输出:

D/SMACK   (  823): 10:44:00 AM RCV  (1156346368): <message id="58Fjj-64" to="eleano@localhost/Smack" from="test@localhost/Spark 2.6.3" type="chat"><body>yes</body><thread>0tlK7o<
D/SMACK   (  823): 10:44:00 AM RCV  (1156346368): /thread><x xmlns="jabber:x:event"><offline/><composing/></x></message>

但是用户eleano没有收到该消息。我们也可以注意到没有:

Log.w("*****Received message" + body + " from " + from, "0*****");

显示在屏幕上,因此永远不会调用MessageListener。这是为什么?我按照文档中的说法正确设置了它。

欢迎任何想法。谢谢。

3 个答案:

答案 0 :(得分:1)

感谢你指出这一点。你的观察让我在连接上设置了一个监听器(并监听Char类型的包),而不是在聊天对象本身上设置一个监听器。

现在我的代码如下所示。我发送这样的包裹:

Message m = new Message(buddy, Message.Type.chat);
m.setBody(message);
connection.sendPacket(m);

并收到如下消息:

  /* packet listener: listen for incoming messages of type CHAT on the connection (whatever the buddy) */
  PacketFilter filter = new MessageTypeFilter(Message.Type.chat); 
  xmppManager.connection.addPacketListener(new PacketListener() { 
    public void processPacket(Packet packet) {
      Message mes = (Message)packet;
      Log.w("***"+mes.toString()+"***","0");
    }
  }, filter);

它有效。我可以向用户发送消息并接收它们。

答案 1 :(得分:0)

您的问题是来自test的消息具有不同的线程ID。这相当于属于不同聊天的消息。如果您创建了一个ChatManagerListener,它将在创建时使用新的Chat进行调用。我不知道为什么回复消息会有不同的线程ID。

通常,会话由线程ID协调。这允许两个用户之间的多个并发对话。话虽这么说,一些客户端根本不使用线程ID。在这种情况下,Smack会将传入的聊天消息与具有相同JID的现有聊天消息(如果已存在)匹配,或者如果不存在则创建新消息。

答案 2 :(得分:0)

也许您可以确保这样的线程ID:

public void processMessage(Chat chat, Message message) {
     UserData user = null;
     MessageData m = null;
     if (message.getType() == Message.Type.chat &&
        (!message.getThread().equals(tempID))) {
            user = model.findUserByAccountName(chat.getParticipant());
            m = new MessageData(user, message.getBody());
            model.receiveMessage(user.getFriendOf(), m);

         }
}