2011-12-23 72 views
1

我已成功连接到XMPP服务器(来自android XMPP客户端),并且可以向用户发送消息,但无法接收来自同一用户的响应。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); 
    } 

我传递的消息监听到createChat功能。该消息监听的类是:

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 [email protected]( 823): 0 
D/SMACK ( 823): 10:43:54 AM SENT (1156346368): <message id="vwaJX-15" to="[email protected]" from="[email protected]/Smack" type="chat"><body>test</body><thread>249ke0</thread></message> 
D/SMACK ( 823): 10:43:54 AM RCV (1156346368): <presence id="vwaJX-12" to="[email protected]/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="[email protected]/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> 

和消息“测试”显示连接用户测试(以这个案例)。我正在发送来自用户eleano的消息。我们还可以看到屏幕上显示了一个调试输出“结束使用用户测试@本地主机的消息”,这表明我的功能确实已成功调用。

在从测试收到消息eleano,我只得到这调试输出:

D/SMACK ( 823): 10:44:00 AM RCV (1156346368): <message id="58Fjj-64" to="[email protected]/Smack" from="[email protected]/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永远不会被调用。这是为什么?正如它在文档中所说的那样,我已经正确设置了它。

欢迎任何想法。谢谢。

回答

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

和它的作品。我可以发送消息给用户,并收到他们就好了。

0

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

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