Java XMPP无法设置侦听器
我已经成功地连接到XMPP服务器(从android 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 +
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);
}
}