Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XMPP无法设置侦听器_Java_Android_Debugging_Xmpp_Smack - Fatal编程技术网

Java XMPP无法设置侦听器

Java XMPP无法设置侦听器,java,android,debugging,xmpp,smack,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 +

我已经成功地连接到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);
  }
Message m = new Message(buddy, Message.Type.chat);
m.setBody(message);
connection.sendPacket(m);
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);

         }
}
我正在将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>
显示在屏幕上,因此永远不会调用MessageListener。为什么呢?我已经按照文档中的说明正确设置了它


欢迎提出任何意见。谢谢。

您的问题是来自测试的消息具有不同的线程id。这等同于属于不同聊天室的消息。如果您创建了ChatManagerListener,则在创建新聊天时会调用它。我不知道为什么回复消息会有不同的线程id


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

您的问题是来自测试的消息具有不同的线程id。这等同于属于不同聊天的消息。如果您创建了ChatManagerListener,则在创建新聊天时会调用它。我不知道为什么回复消息会有不同的线程id


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

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

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

  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);
  }
Message m = new Message(buddy, Message.Type.chat);
m.setBody(message);
connection.sendPacket(m);
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);

         }
}
并接收如下信息:

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

它是有效的。我可以向用户发送消息并接收它们。谢谢您指出这一点。您的观察使我在连接上设置了一个侦听器(并侦听Char类型的包),而不是在聊天对象本身上设置侦听器

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

  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);
  }
Message m = new Message(buddy, Message.Type.chat);
m.setBody(message);
connection.sendPacket(m);
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);

         }
}
并接收如下信息:

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

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

也许您可以确保线程id如下:

  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);
  }
Message m = new Message(buddy, Message.Type.chat);
m.setBody(message);
connection.sendPacket(m);
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);

         }
}

也许您可以确保线程id如下所示:

  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);
  }
Message m = new Message(buddy, Message.Type.chat);
m.setBody(message);
connection.sendPacket(m);
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);

         }
}