版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/41620843
XMPP用戶端庫Smack 4.0.6版開發之五
作者:chszs,轉載需注明。部落格首頁:
http://blog.csdn.net/chszs四、使用Chat消息通信
來回收發消息是即時通信的核心功能。盡管單條消息是以包的形式發送和接收的,通常還是把他視為聊天的消息字元串,使用org.jivesoftware.smack.Chat類。
1、Chat類
一個聊天Chat會在兩個使用者之間建立一個消息線程(通過線程ID)。下面的代碼片段示範了怎樣建立一個新聊天,然後向使用者發送一條文本消息:
//假設已經建立了一個名為"connection"的XMPPConnection
ChatManagerchatmanager = connection.getChatManager();
ChatnewChat = chatmanager.createChat("[email protected]", newMessageListener(){
public void processMessage(Chat chat,Message message){
System.out.println(“Receivedmessage: “+ message);
}
});
try{
newChat.sendMessage(“Howdy!”);
}catch(XMPPExceptione){
System.out.println(“Error Deliveringblock”);
}
Chat.sendMessage(String)方法可以友善地建立一個消息Message對象,用字元串參數設定消息正文Body,然後發送消息。在某些情況下你可能希望在發送消息前設定額外的值,使用Chat.createMessage()方法和Chat.sendMessage(Message)方法,如下面的代碼片段所示:
MessagenewMessage = new Message();
newMessage.setBody(“Howdy!”);
message.setProperty(“favoriteColor”,“red”);
newChat.sendMessage(newMessage);
前面的例子中,我們可以注意到,在建立聊天Chat時指定了一個消息監聽器MessageListener,在任意時刻,當來自其它使用者的聊天消息到達後,消息監聽器會得到通知。下面的代碼片段使用了監聽器做鹦鹉學舌,它會回顯來自其他使用者傳遞的消息。
//假設在聊天Chat中已經設定了消息監聽器MessageListener
publicvoid processMessage(Chat chat, Message message){
// 把使用者發送的消息内容發送給使用者
chat.sendMessage(message.getBody());
2、來電聊天
當提示有另一個使用者的聊天消息到了後,設定有輕微的不同,因為你是首次接收到聊天消息。取代明确地建立一個Chat來發送消息,當ChatManager建立了Chat執行個體後,你需要注冊處理新建立的Chat執行個體。ChatManager會通過線程ID找到比對的Chat,如果Chat不存在,那麼它會建立一個新Chat對象來比對。要得到這個新Chat,你必須注冊來得到通知。可以注冊一個消息監聽器來接收所有要到來的消息。
//假定已經建立了名為”connection”的XMPPConnection
ChatManagercm = connection.getChatManager().addChatListener(new ChatManagerListener(){
@Override
public void chatCreated(Chat chat, BooleancreatedLocally){
if(!createdLocally)
chat.addMessageListener(newMyNewMessageListener());
除了基于線程的Chat消息,也有一些用戶端不發送線程ID作為Chat的一部分。要處理這種情況,Smack會基于JID嘗試比對接收的消息到最比對現有的Chat。它會嘗試用完整的JID來查找Chat,如果搜不到,再嘗試用基本的JID來查找Chat。如果找不到現有的Chat來比對,那麼會建立一個新Chat。