openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)

it2022-05-05  114

一、单人聊天

1)发送消息:

首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取

[java]  view plain copy private Map<String, Chat> chatManage = new HashMap<String, Chat>();// 聊天窗口管理map集合      /**   * 获取或创建聊天窗口   * @param friend 好友名   * @param listenter 聊天監聽器   * @return   */   public Chat getFriendChat(String friend, MessageListener listenter) {       if(getConnection()==null)           return null;       /** 判断是否创建聊天窗口 */       for (String fristr : chatManage.keySet()) {           if (fristr.equals(friend)) {               // 存在聊天窗口,则返回对应聊天窗口               return chatManage.get(fristr);           }       }       /** 创建聊天窗口 */       Chat chat = getConnection().getChatManager().createChat(friend + "@"+               getConnection().getServiceName(), listenter);       /** 添加聊天窗口到chatManage */       chatManage.put(friend, chat);       return chat;   }  

friend为好友名,不是JID;listener 监听器可以传null,利用聊天窗口对象调用sendMessage发送消息

这里sendMessage我传的是一个JSON字符串,以便更灵活的控制,发送消息完成~

[java]  view plain copy Chat chat = getFriendChat(friend,null);   try {       String msgjson = "{\"messageType\":\""+messageType+"\",\"chanId\":\""+chanId+"\",\"chanName\":\""+chanName+"\"}";       chat.sendMessage(msgjson);   catch (XMPPException e) {       e.printStackTrace();   }   2)接受消息:

创建一个消息监听器,单独写了一个类

[java]  view plain copy package com.techrare.listener;      import org.jivesoftware.smack.Chat;   import org.jivesoftware.smack.ChatManagerListener;   import org.jivesoftware.smack.MessageListener;   import org.jivesoftware.smack.packet.Message;   import org.jivesoftware.smack.util.StringUtils;   import org.json.JSONException;   import org.json.JSONObject;      import com.techrare.utils.XmppConnection;      /**   * 单人聊天信息监听类   *    * @author Administrator   *    */   public class TaxiChatManagerListener implements ChatManagerListener {          public void chatCreated(Chat chat, boolean arg1) {           chat.addMessageListener(new MessageListener() {               public void processMessage(Chat arg0, Message msg) {                   //登录用户                   StringUtils.parseName(XmppConnection.getInstance().getConnection().getUser());                   //发送消息用户                   msg.getFrom();                   //消息内容                   String body = msg.getBody();                   boolean left = body.substring(01).equals("{");                   boolean right = body.substring(body.length()-1, body.length()).equals("}");                   if(left&&right){                       try {                           JSONObject obj = new JSONObject(body);                           String type = obj.getString("messageType");                           String chanId = obj.getString("chanId");                           String chanName = obj.getString("chanName");                       } catch (JSONException e) {                           e.printStackTrace();                       }                                          }               }           });       }   }   添加监听,最好是放在登录方法中,在关闭连接方法中,移除监听,原因是为了避免重复添加监听,接受重复消息

退出程序应该关闭连接,移除监听,该监听可以接受所有好友的消息,很方便吧~

[java]  view plain copy TaxiChatManagerListener chatManagerListener = new TaxiChatManagerListener();   getConnection().getChatManager().addChatListener(chatManagerListener);   [java]  view plain copy connection.getChatManager().removeChatListener(chatManagerListener);   二、多人聊天(会议室)

1)、发送消息

首先要获取会议室对象(MultiUserChat),有两种方法获取

两个方法前面都有讲到,这里再回顾一下

1、创建会议室  

[java]  view plain copy /**   * 创建房间   *    * @param roomName  房间名称   */   public MultiUserChat createRoom(String user, String roomName,String password) {       if (getConnection() == null)           return null;          MultiUserChat muc = null;       try {           // 创建一个MultiUserChat           muc = new MultiUserChat(getConnection(), roomName + "@conference."                   + getConnection().getServiceName());           // 创建聊天室           muc.create(roomName);           // 获得聊天室的配置表单           Form form = muc.getConfigurationForm();           // 根据原始表单创建一个要提交的新表单。           Form submitForm = form.createAnswerForm();           // 向要提交的表单添加默认答复           for (Iterator<FormField> fields = form.getFields(); fields                   .hasNext();) {               FormField field = (FormField) fields.next();               if (!FormField.TYPE_HIDDEN.equals(field.getType())                       && field.getVariable() != null) {                   // 设置默认值作为答复                   submitForm.setDefaultAnswer(field.getVariable());               }           }           // 设置聊天室的新拥有者           List<String> owners = new ArrayList<String>();           owners.add(getConnection().getUser());// 用户JID           submitForm.setAnswer("muc#roomconfig_roomowners", owners);           // 设置聊天室是持久聊天室,即将要被保存下来           submitForm.setAnswer("muc#roomconfig_persistentroom"true);           // 房间仅对成员开放           submitForm.setAnswer("muc#roomconfig_membersonly"false);           // 允许占有者邀请其他人           submitForm.setAnswer("muc#roomconfig_allowinvites"true);           if (!password.equals("")) {               // 进入是否需要密码               submitForm.setAnswer("muc#roomconfig_passwordprotectedroom",                       true);               // 设置进入密码               submitForm.setAnswer("muc#roomconfig_roomsecret", password);           }           // 能够发现占有者真实 JID 的角色           // submitForm.setAnswer("muc#roomconfig_whois", "anyone");           // 登录房间对话           submitForm.setAnswer("muc#roomconfig_enablelogging"true);           // 仅允许注册的昵称登录           submitForm.setAnswer("x-muc#roomconfig_reservednick"true);           // 允许使用者修改昵称           submitForm.setAnswer("x-muc#roomconfig_canchangenick"false);           // 允许用户注册房间           submitForm.setAnswer("x-muc#roomconfig_registration"false);           // 发送已完成的表单(有默认值)到服务器来配置聊天室           muc.sendConfigurationForm(submitForm);       } catch (XMPPException e) {           e.printStackTrace();           return null;       }       return muc;   }   2、加入会议室,

[java]  view plain copy /**   * 加入会议室   *    * @param user   *            昵称   * @param password   *            会议室密码   * @param roomsName   *            会议室名   */   public MultiUserChat joinMultiUserChat(String user, String roomsName,           String password) {       if (getConnection() == null)           return null;       try {           // 使用XMPPConnection创建一个MultiUserChat窗口           MultiUserChat muc = new MultiUserChat(getConnection(), roomsName                   + "@conference." + getConnection().getServiceName());           // 聊天室服务将会决定要接受的历史记录数量           DiscussionHistory history = new DiscussionHistory();           history.setMaxChars(0);           // history.setSince(new Date());           // 用户加入聊天室           muc.join(user, password, history,                   SmackConfiguration.getPacketReplyTimeout());           Log.i("MultiUserChat""会议室【"+roomsName+"】加入成功........");           return muc;       } catch (XMPPException e) {           e.printStackTrace();           Log.i("MultiUserChat""会议室【"+roomsName+"】加入失败........");           return null;       }   }   调用这个两个方法都可以获取到 MultiUserChat,根据需求选择一个就可以。

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

[java]  view plain copy try {       multiUserChat.sendMessage(message);   catch (XMPPException e) {       e.printStackTrace();   }  

2)接受消息

    创建会议室消息监听器,这里我也单独写了一个类

[java]  view plain copy package com.techrare.listener;      import org.jivesoftware.smack.PacketListener;   import org.jivesoftware.smack.packet.Message;   import org.jivesoftware.smack.packet.Packet;      /**   * 会议室消息监听类   *    * @author Administrator   *    */   public class TaxiMultiListener implements PacketListener {          @Override       public void processPacket(Packet packet) {           Message message = (Message) packet;           String body = message.getBody();                  }   }   添加监听器,每个会议室聊天对象都要添加一个消息监听器,为了避免重复监听

应该把会议室聊天对象放在一个集合当中,需要用到的时候取出来用即可。

[java]  view plain copy multiUserChat.addMessageListener(new TaxiMultiListener());  

转载于:https://www.cnblogs.com/jasonkent27/p/4098438.html

相关资源:各显卡算力对照表!

最新回复(0)