2010-11-09 51 views
0

我使用下面的代碼發送消息。收到Smack的第一條消息時出現問題

// Assume we've created an XMPPConnection name "connection". 
ChatManager chatmanager = connection.getChatManager(); 
Chat newChat = chatmanager.createChat("[email protected]", new MessageListener() { 
    public void processMessage(Chat chat, Message message) { 
     System.out.println("Received message: " + message); 
    } 
}); 

try { 
    newChat.sendMessage("Howdy!"); 
} 
catch (XMPPException e) { 
    System.out.println("Error Delivering block"); 
} 

下面用於接收發送到我的JabberID的消息,異步。

// Create a packet filter to listen for new messages from a particular 
// user. We use an AndFilter to combine two other filters. 
PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class), 
     new FromContainsFilter("[email protected]")); 
// Assume we've created an XMPPConnection name "connection". 

// First, register a packet collector using the filter we created. 
PacketCollector myCollector = connection.createPacketCollector(filter); 
// Normally, you'd do something with the collector, like wait for new packets. 

// Next, create a packet listener. We use an anonymous inner class for brevity. 
PacketListener myListener = new PacketListener() { 
     public void processPacket(Packet packet) { 
      // Do something with the incoming packet here. 
     } 
    }; 
// Register the listener. 
connection.addPacketListener(myListener, filter); 

發送消息是可以的。

但是,接收來自另一個JabberID的消息在我向該JabberID發送消息之前無法獲得。

然後我收到正確發送的消息。

請注意,我經常需要接收來自不在我列表中的jabberID的消息,而且我的應用程序經常不是開始聊天的一方。

上面的代碼是很好的示例,但我的代碼完全相同,除非我不創建PacketListener實現內聯。

+0

雖然我在想你的問題,請仔細看看[用smack調試](http://www.igniterealtime.org/builds/smack/docs/latest/documentation/debugging.html)。在simlpy打開調試器後,我幾乎可以解決所有問題;-) – 2010-11-09 13:09:32

+0

您的代碼是否完整?我沒有任何調用myCollector.nextPacket()... – mschonaker 2011-05-25 21:44:36

回答

3

我的問題解決了,當我停止使用Jabber客戶端與在測試我的程序期間,同一個用戶被登錄。 換句話說,代碼是正確的,但Jabber客戶端捕獲已發送的消息,並且不會讓我的程序捕獲。

+0

請將您的問題標記爲已回答。 :) – Flow 2011-08-20 16:41:14

0

從我與smack一起工作已經有一段時間了,但我設法根據傳入消息開始聊天。

如果我記得不錯,我有某種「ChatRegistry」,一個簡單的Map<String, Chat>,其中密鑰等於聊天夥伴id。然後,我收聽傳入的消息,提取了jabber標識並查找了與此合作伙伴進行的活動聊天會話。如果沒有活動的會話,我創建了一個新的聊天並將新的密鑰/值對添加到註冊表中。

+0

我認爲有一個錯誤的循環 – mjafari 2010-11-15 08:09:16

+0

我無法找到ChatRegistry或Sometings喜歡它,我認爲你的建議有一個錯誤的循環:如果我知道誰想給我發一條消息,然後不存在問題。 – mjafari 2010-11-15 08:12:17

0

只是有點困惑。你說

上面的代碼是smack示例,但我的代碼是完全相同的,除非我不創建PacketListener實現內聯。

如何在沒有PacketListener實現的情況下接收消息?我會認爲你總是從聊天接收消息你開始的,因爲下面

聊天newChat = chatmanager.createChat(「[email protected]」,新的MessageListener(){ 公共無效而processMessage(聊天代碼聊天消息){ System.out.println(「Received message:」+ message); } });

但爲了異步等待傳入消息,我想你會需要一個PacketListener。 我可能會完全誤解了你所面對雖然

問題(這應該是一個評論,但我想不出如何添加一個)

+0

1.我實現了PacketListener,但沒有嵌入 – mjafari 2010-11-13 06:58:59

0

已經有一段時間了,你是否設法解決這個問題?你爲什麼要創建FromContainsFilter?這樣,你的監聽者只處理給定用戶的數據包,而不是所有數據包。