Openfire 單人聊天和多人聊天(發送消息、接收消息)


Openfire 單人聊天和多人聊天(發送消息、接收消息)

一、單人聊天

1)發送消息:

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

  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字符串,以便更靈活的控制,發送消息完成,很簡單吧~

  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)接受消息:

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

  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(0, 1).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. }


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

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

  1. TaxiChatManagerListener chatManagerListener = new TaxiChatManagerListener();
  2. getConnection().getChatManager().addChatListener(chatManagerListener);
connection.getChatManager().removeChatListener(chatManagerListener);



二、多人聊天(會議室)

1)、發送消息

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

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

1、創建會議室  

  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、加入會議室,

  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()方法即可,很容易吧~

  1. try {
  2. multiUserChat.sendMessage(message);
  3. } catch (XMPPException e) {
  4. e.printStackTrace();
  5. }

 

2)接受消息

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

  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. }


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

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

multiUserChat.addMessageListener(new TaxiMultiListener());

https://blog.csdn.net/qq_17169057/article/details/50437925



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM