openfire Android 學習(四)----單人聊天和多人聊天(發送消息、接收消息)

一、單人聊天

1)發送消息:

首先要獲取一個聊天窗口,getConnection()爲獲取連接connection的方法,調用getFriendChat()獲取

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. private Map<String, Chat> chatManage = new HashMap<String, Chat>();// 聊天窗口管理map集合  
  2.   
  3. /** 
  4.  * 獲取或創建聊天窗口 
  5.  * @param friend 好友名 
  6.  * @param listenter 聊天監聽器 
  7.  * @return 
  8.  */  
  9. public Chat getFriendChat(String friend, MessageListener listenter) {  
  10.     if(getConnection()==null)  
  11.         return null;  
  12.     /** 判斷是否創建聊天窗口 */  
  13.     for (String fristr : chatManage.keySet()) {  
  14.         if (fristr.equals(friend)) {  
  15.             // 存在聊天窗口,則返回對應聊天窗口  
  16.             return chatManage.get(fristr);  
  17.         }  
  18.     }  
  19.     /** 創建聊天窗口 */  
  20.     Chat chat = getConnection().getChatManager().createChat(friend + "@"+  
  21.             getConnection().getServiceName(), listenter);  
  22.     /** 添加聊天窗口到chatManage */  
  23.     chatManage.put(friend, chat);  
  24.     return chat;  
  25. }  

friend爲好友名,不是JID;listener 監聽器可以傳null,利用聊天窗口對象調用sendMessage發送消息

這裏sendMessage我傳的是一個JSON字符串,以便更靈活的控制,發送消息完成~

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. Chat chat = getFriendChat(friend,null);  
  2. try {  
  3.     String msgjson = "{\"messageType\":\""+messageType+"\",\"chanId\":\""+chanId+"\",\"chanName\":\""+chanName+"\"}";  
  4.     chat.sendMessage(msgjson);  
  5. catch (XMPPException e) {  
  6.     e.printStackTrace();  
  7. }  

2)接受消息:

創建一個消息監聽器,單獨寫了一個類

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.techrare.listener;  
  2.   
  3. import org.jivesoftware.smack.Chat;  
  4. import org.jivesoftware.smack.ChatManagerListener;  
  5. import org.jivesoftware.smack.MessageListener;  
  6. import org.jivesoftware.smack.packet.Message;  
  7. import org.jivesoftware.smack.util.StringUtils;  
  8. import org.json.JSONException;  
  9. import org.json.JSONObject;  
  10.   
  11. import com.techrare.utils.XmppConnection;  
  12.   
  13. /** 
  14.  * 單人聊天信息監聽類 
  15.  *  
  16.  * @author Administrator 
  17.  *  
  18.  */  
  19. public class TaxiChatManagerListener implements ChatManagerListener {  
  20.   
  21.     public void chatCreated(Chat chat, boolean arg1) {  
  22.         chat.addMessageListener(new MessageListener() {  
  23.             public void processMessage(Chat arg0, Message msg) {  
  24.                 //登錄用戶  
  25.                 StringUtils.parseName(XmppConnection.getInstance().getConnection().getUser());  
  26.                 //發送消息用戶  
  27.                 msg.getFrom();  
  28.                 //消息內容  
  29.                 String body = msg.getBody();  
  30.                 boolean left = body.substring(01).equals("{");  
  31.                 boolean right = body.substring(body.length()-1, body.length()).equals("}");  
  32.                 if(left&&right){  
  33.                     try {  
  34.                         JSONObject obj = new JSONObject(body);  
  35.                         String type = obj.getString("messageType");  
  36.                         String chanId = obj.getString("chanId");  
  37.                         String chanName = obj.getString("chanName");  
  38.                     } catch (JSONException e) {  
  39.                         e.printStackTrace();  
  40.                     }  
  41.                       
  42.                 }  
  43.             }  
  44.         });  
  45.     }  
  46. }  

添加監聽,最好是放在登錄方法中,在關閉連接方法中,移除監聽,原因是爲了避免重複添加監聽,接受重複消息

退出程序應該關閉連接,移除監聽,該監聽可以接受所有好友的消息,很方便吧~

[java] view plaincopy
  1. TaxiChatManagerListener chatManagerListener = new TaxiChatManagerListener();  
  2. getConnection().getChatManager().addChatListener(chatManagerListener);  
[java] view plaincopy
  1. connection.getChatManager().removeChatListener(chatManagerListener);  
二、多人聊天(會議室)

1)、發送消息

首先要獲取會議室對象(MultiUserChat),有兩種方法獲取

兩個方法前面都有講到,這裏再回顧一下

1、創建會議室  

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2.  * 創建房間 
  3.  *  
  4.  * @param roomName  房間名稱 
  5.  */  
  6. public MultiUserChat createRoom(String user, String roomName,String password) {  
  7.     if (getConnection() == null)  
  8.         return null;  
  9.   
  10.     MultiUserChat muc = null;  
  11.     try {  
  12.         // 創建一個MultiUserChat  
  13.         muc = new MultiUserChat(getConnection(), roomName + "@conference."  
  14.                 + getConnection().getServiceName());  
  15.         // 創建聊天室  
  16.         muc.create(roomName);  
  17.         // 獲得聊天室的配置表單  
  18.         Form form = muc.getConfigurationForm();  
  19.         // 根據原始表單創建一個要提交的新表單。  
  20.         Form submitForm = form.createAnswerForm();  
  21.         // 向要提交的表單添加默認答覆  
  22.         for (Iterator<FormField> fields = form.getFields(); fields  
  23.                 .hasNext();) {  
  24.             FormField field = (FormField) fields.next();  
  25.             if (!FormField.TYPE_HIDDEN.equals(field.getType())  
  26.                     && field.getVariable() != null) {  
  27.                 // 設置默認值作爲答覆  
  28.                 submitForm.setDefaultAnswer(field.getVariable());  
  29.             }  
  30.         }  
  31.         // 設置聊天室的新擁有者  
  32.         List<String> owners = new ArrayList<String>();  
  33.         owners.add(getConnection().getUser());// 用戶JID  
  34.         submitForm.setAnswer("muc#roomconfig_roomowners", owners);  
  35.         // 設置聊天室是持久聊天室,即將要被保存下來  
  36.         submitForm.setAnswer("muc#roomconfig_persistentroom"true);  
  37.         // 房間僅對成員開放  
  38.         submitForm.setAnswer("muc#roomconfig_membersonly"false);  
  39.         // 允許佔有者邀請其他人  
  40.         submitForm.setAnswer("muc#roomconfig_allowinvites"true);  
  41.         if (!password.equals("")) {  
  42.             // 進入是否需要密碼  
  43.             submitForm.setAnswer("muc#roomconfig_passwordprotectedroom",  
  44.                     true);  
  45.             // 設置進入密碼  
  46.             submitForm.setAnswer("muc#roomconfig_roomsecret", password);  
  47.         }  
  48.         // 能夠發現佔有者真實 JID 的角色  
  49.         // submitForm.setAnswer("muc#roomconfig_whois", "anyone");  
  50.         // 登錄房間對話  
  51.         submitForm.setAnswer("muc#roomconfig_enablelogging"true);  
  52.         // 僅允許註冊的暱稱登錄  
  53.         submitForm.setAnswer("x-muc#roomconfig_reservednick"true);  
  54.         // 允許使用者修改暱稱  
  55.         submitForm.setAnswer("x-muc#roomconfig_canchangenick"false);  
  56.         // 允許用戶註冊房間  
  57.         submitForm.setAnswer("x-muc#roomconfig_registration"false);  
  58.         // 發送已完成的表單(有默認值)到服務器來配置聊天室  
  59.         muc.sendConfigurationForm(submitForm);  
  60.     } catch (XMPPException e) {  
  61.         e.printStackTrace();  
  62.         return null;  
  63.     }  
  64.     return muc;  
  65. }  

2、加入會議室,

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2.  * 加入會議室 
  3.  *  
  4.  * @param user 
  5.  *            暱稱 
  6.  * @param password 
  7.  *            會議室密碼 
  8.  * @param roomsName 
  9.  *            會議室名 
  10.  */  
  11. public MultiUserChat joinMultiUserChat(String user, String roomsName,  
  12.         String password) {  
  13.     if (getConnection() == null)  
  14.         return null;  
  15.     try {  
  16.         // 使用XMPPConnection創建一個MultiUserChat窗口  
  17.         MultiUserChat muc = new MultiUserChat(getConnection(), roomsName  
  18.                 + "@conference." + getConnection().getServiceName());  
  19.         // 聊天室服務將會決定要接受的歷史記錄數量  
  20.         DiscussionHistory history = new DiscussionHistory();  
  21.         history.setMaxChars(0);  
  22.         // history.setSince(new Date());  
  23.         // 用戶加入聊天室  
  24.         muc.join(user, password, history,  
  25.                 SmackConfiguration.getPacketReplyTimeout());  
  26.         Log.i("MultiUserChat""會議室【"+roomsName+"】加入成功........");  
  27.         return muc;  
  28.     } catch (XMPPException e) {  
  29.         e.printStackTrace();  
  30.         Log.i("MultiUserChat""會議室【"+roomsName+"】加入失敗........");  
  31.         return null;  
  32.     }  
  33. }  

調用這個兩個方法都可以獲取到MultiUserChat,根據需求選擇一個就可以。

利用MultiUserChat對象調用sendMessage()方法即可,很容易吧~

[java] view plaincopy
  1. try {  
  2.     multiUserChat.sendMessage(message);  
  3. catch (XMPPException e) {  
  4.     e.printStackTrace();  
  5. }  


2)接受消息

    創建會議室消息監聽器,這裏我也單獨寫了一個類

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.techrare.listener;  
  2.   
  3. import org.jivesoftware.smack.PacketListener;  
  4. import org.jivesoftware.smack.packet.Message;  
  5. import org.jivesoftware.smack.packet.Packet;  
  6.   
  7. /** 
  8.  * 會議室消息監聽類 
  9.  *  
  10.  * @author Administrator 
  11.  *  
  12.  */  
  13. public class TaxiMultiListener implements PacketListener {  
  14.   
  15.     @Override  
  16.     public void processPacket(Packet packet) {  
  17.         Message message = (Message) packet;  
  18.         String body = message.getBody();  
  19.           
  20.     }  
  21. }  

添加監聽器,每個會議室聊天對象都要添加一個消息監聽器,爲了避免重複監聽

應該把會議室聊天對象放在一個集合當中,需要用到的時候取出來用即可。

[java] view plaincopy
  1. multiUserChat.addMessageListener(new TaxiMultiListener());  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章