• 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());  
  • 相关阅读:
    @import的最优写法
    IE7 下hack的方法
    在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
    MySQL 依赖另外一个统计出来数据更新表数据的范例
    PHP的bool值
    Ubuntu 下如何配置Jira
    ubuntu 访问Windows的共享
    备份 mysql数据
    ubuntu从中文切换成英文的方法
    css锚点定位偏移原理兼容浏览器
  • 原文地址:https://www.cnblogs.com/jasonkent27/p/4098438.html
Copyright © 2020-2023  润新知