2011-12-23 104 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的現有聊天消息匹配(如果已存在),或者如果不存在,則創建一個新聊天消息。