Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1393489
  • 博文数量: 188
  • 博客积分: 1784
  • 博客等级: 上尉
  • 技术积分: 2772
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-05 22:20
个人简介

发上等愿,结中等缘,享下等福;择高处立,就平处坐,向宽处行。

文章分类

全部博文(188)

文章存档

2020年(12)

2019年(11)

2018年(4)

2017年(3)

2016年(11)

2015年(22)

2014年(19)

2013年(25)

2012年(32)

2011年(49)

分类: Android平台

2015-06-23 13:56:09

openfire 中的会议室不像QQ群一样,不能保存那些离线用户,加入会议室后,一旦断开连接,就会离开会议室。

虽然如此,但如果要实现也不是不可能,我们可以自己做后台来保存,有兴趣的可以去试着实现一下,这里就不实现了。

好了,下面我们就一起来学习一下创建会议室、加入会议室以及查询会议室中的所有成员:

一、创建会议室

注释都写的很清楚,不做太多解释。

需要配置更多信息,可以到   中15.5.3 muc#roomconfig FORM_TYPE 查看配置

里面还有一些关于会议室的信息,感兴趣的可以看看,不过里面都是英文,不懂英文的可以谷歌翻译,楼主就是这么干的~


  1. /** 
  2.      * 创建房间 
  3.      *  
  4.      * @param roomName 房间名称 
  5.      */  
  6.     public static void createRoom(String roomName) {  
  7.         if (connection == null) {  
  8.             return;  
  9.         }  
  10.         try {  
  11.             // 创建一个MultiUserChat  
  12.             MultiUserChat muc = new MultiUserChat(connection, roomName  
  13.                     + "@conference." + connection.getServiceName());  
  14.             // 创建聊天室  
  15.             muc.create(roomName); // roomName房间的名字  
  16.             // 获得聊天室的配置表单  
  17.             Form form = muc.getConfigurationForm();  
  18.             // 根据原始表单创建一个要提交的新表单。  
  19.             Form submitForm = form.createAnswerForm();  
  20.             // 向要提交的表单添加默认答复  
  21.             for (Iterator fields = form.getFields(); fields  
  22.                     .hasNext();) {  
  23.                 FormField field = (FormField) fields.next();  
  24.                 if (!FormField.TYPE_HIDDEN.equals(field.getType())  
  25.                         && field.getVariable() != null) {  
  26.                     // 设置默认值作为答复  
  27.                     submitForm.setDefaultAnswer(field.getVariable());  
  28.                 }  
  29.             }  
  30.             // 设置聊天室的新拥有者  
  31.             List owners = new ArrayList();  
  32.             owners.add(connection.getUser());// 用户JID  
  33.             submitForm.setAnswer("muc#roomconfig_roomowners", owners);  
  34.             // 设置聊天室是持久聊天室,即将要被保存下来  
  35.             submitForm.setAnswer("muc#roomconfig_persistentroom"false);  
  36.             // 房间仅对成员开放  
  37.             submitForm.setAnswer("muc#roomconfig_membersonly"false);  
  38.             // 允许占有者邀请其他人  
  39.             submitForm.setAnswer("muc#roomconfig_allowinvites"true);  
  40.             // 进入是否需要密码  
  41.             //submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", true);  
  42.             // 设置进入密码  
  43.             //submitForm.setAnswer("muc#roomconfig_roomsecret", "password");  
  44.             // 能够发现占有者真实 JID 的角色  
  45.             // submitForm.setAnswer("muc#roomconfig_whois", "anyone");  
  46.             // 登录房间对话  
  47.             submitForm.setAnswer("muc#roomconfig_enablelogging"true);  
  48.             // 仅允许注册的昵称登录  
  49.             submitForm.setAnswer("x-muc#roomconfig_reservednick"true);  
  50.             // 允许使用者修改昵称  
  51.             submitForm.setAnswer("x-muc#roomconfig_canchangenick"false);  
  52.             // 允许用户注册房间  
  53.             submitForm.setAnswer("x-muc#roomconfig_registration"false);  
  54.             // 发送已完成的表单(有默认值)到服务器来配置聊天室  
  55.             submitForm.setAnswer("muc#roomconfig_passwordprotectedroom"true);           
  56.             // 发送已完成的表单(有默认值)到服务器来配置聊天室  
  57.             muc.sendConfigurationForm(submitForm);  
  58.         } catch (XMPPException e) {  
  59.             e.printStackTrace();  
  60.         }  
  61.     }  

二、加入会议室


  1. /** 
  2.      * 加入会议室 
  3.      *  
  4.      * @param user 昵称 
  5.      * @param password 会议室密码 
  6.      * @param roomsName 会议室名 
  7.      * @param connection  
  8.      */  
  9.     public static MultiUserChat joinMultiUserChat(String user, String password, String roomsName,  
  10.             XMPPConnection connection) {  
  11.         try {  
  12.             // 使用XMPPConnection创建一个MultiUserChat窗口  
  13.             MultiUserChat muc = new MultiUserChat(connection, roomsName  
  14.                     + "@conference." + connection.getServiceName());  
  15.             // 聊天室服务将会决定要接受的历史记录数量  
  16.             DiscussionHistory history = new DiscussionHistory();  
  17.                 history.setMaxStanzas(0);  
  18.                         //history.setSince(new Date());  
  19.             // 用户加入聊天室  
  20.                 muc.join(user, password, history, SmackConfiguration.getPacketReplyTimeout());  
  21.             System.out.println("会议室加入成功........");  
  22.             return muc;  
  23.         } catch (XMPPException e) {  
  24.             e.printStackTrace();  
  25.             System.out.println("会议室加入失败........");  
  26.             return null;  
  27.         }  
  28.     }  

三、查询会议室中的所有成员


注意:这里查询出来的名字只是用户进入会议室所用的昵称


  1. /** 
  2.      * 查询会议室成员名字 
  3.      * @param muc 
  4.      */  
  5.     public static List findMulitUser(MultiUserChat muc){  
  6.         List listUser = new ArrayList();  
  7.         Iterator it = muc.getOccupants();  
  8.         //遍历出聊天室人员名称  
  9.         while (it.hasNext()) {  
  10.             // 聊天室成员名字  
  11.             String name = StringUtils.parseResource(it.next());  
  12.             listUser.add(name);  
  13.         }  
  14.         return listUser;  
  15.     }  


四、获取服务器上所有会议室


  1. /** 
  2.      * 获取服务器上所有会议室 
  3.      * @return 
  4.      * @throws XMPPException 
  5.      */  
  6.     public static List getConferenceRoom() throws XMPPException {  
  7.         List list = new ArrayList();  
  8.         new ServiceDiscoveryManager(connection);  
  9.         if (!MultiUserChat.getHostedRooms(connection,  
  10.                 connection.getServiceName()).isEmpty()) {  
  11.   
  12.             for (HostedRoom k : MultiUserChat.getHostedRooms(connection,  
  13.                     connection.getServiceName())) {  
  14.   
  15.                 for (HostedRoom j : MultiUserChat.getHostedRooms(connection,  
  16.                         k.getJid())) {  
  17.                     RoomInfo info2 = MultiUserChat.getRoomInfo(connection,  
  18.                             j.getJid());  
  19.                     if (j.getJid().indexOf("@") > 0) {  
  20.   
  21.                         FriendRooms friendrooms = new FriendRooms();  
  22.                         friendrooms.setName(j.getName());//聊天室的名称  
  23.                         friendrooms.setJid(j.getJid());//聊天室JID  
  24.                         friendrooms.setOccupants(info2.getOccupantsCount());//聊天室中占有者数量  
  25.                         friendrooms.setDescription(info2.getDescription());//聊天室的描述  
  26.                         friendrooms.setSubject(info2.getSubject());//聊天室的主题  
  27.                         list.add(friendrooms);  
  28.                     }  
  29.                 }  
  30.             }  
  31.         }  
  32.         return list;  
  33.     }  


五、监听会议室的消息

添加会议室消息监听 :


  1. multiChat.addMessageListener(new multiListener());  


  1. /** 
  2.      * 會議室信息監聽事件 
  3.      *  
  4.      * @author Administrator 
  5.      *  
  6.      */  
  7.     public class multiListener implements PacketListener {  
  8.         @Override  
  9.         public void processPacket(Packet packet) {  
  10.             Message message = (Message) packet;  
  11.             // 接收来自聊天室的聊天信息  
  12.             String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());  
  13.             MucHistory mh = new MucHistory();  
  14.             mh.setUserAccount(account);  
  15.             String from = StringUtils.parseResource(message.getFrom());  
  16.             String fromRoomName = StringUtils.parseName(message.getFrom());  
  17.             mh.setMhRoomName(fromRoomName);  
  18.             mh.setFriendAccount(from);  
  19.             mh.setMhInfo(message.getBody());  
  20.             mh.setMhTime(time);  
  21.             mh.setMhType("left");  
  22.   
  23.         }  
  24.     }  

六、发送会议室消息


  1. multiChat.sendMessage(str);//multiChat 为聊天室对象  

七、监听会议室状态(成员的进入、离开等)


添加监听事件:


  1. multiChat.addParticipantStatusListener(new ParticipantStatus());  


会议室状态监听事件:


  1. /** 
  2.      * 会议室状态监听事件 
  3.      *  
  4.      * @author Administrator 
  5.      *  
  6.      */  
  7.     class ParticipantStatus implements ParticipantStatusListener {  
  8.   
  9.         @Override  
  10.         public void adminGranted(String arg0) {  
  11.             // TODO Auto-generated method stub  
  12.   
  13.         }  
  14.   
  15.         @Override  
  16.         public void adminRevoked(String arg0) {  
  17.             // TODO Auto-generated method stub  
  18.   
  19.         }  
  20.   
  21.         @Override  
  22.         public void banned(String arg0, String arg1, String arg2) {  
  23.             // TODO Auto-generated method stub  
  24.   
  25.         }  
  26.   
  27.         @Override  
  28.         public void joined(String participant) {  
  29.             System.out.println(StringUtils.parseResource(participant)+ " has joined the room.");  
  30.         }  
  31.   
  32.         @Override  
  33.         public void kicked(String arg0, String arg1, String arg2) {  
  34.             // TODO Auto-generated method stub  
  35.   
  36.         }  
  37.   
  38.         @Override  
  39.         public void left(String participant) {  
  40.             // TODO Auto-generated method stub  
  41.             System.out.println(StringUtils.parseResource(participant)+ " has left the room.");  
  42.               
  43.         }  
  44.   
  45.         @Override  
  46.         public void membershipGranted(String arg0) {  
  47.             // TODO Auto-generated method stub  
  48.   
  49.         }  
  50.   
  51.         @Override  
  52.         public void membershipRevoked(String arg0) {  
  53.             // TODO Auto-generated method stub  
  54.   
  55.         }  
  56.   
  57.         @Override  
  58.         public void moderatorGranted(String arg0) {  
  59.             // TODO Auto-generated method stub  
  60.   
  61.         }  
  62.   
  63.         @Override  
  64.         public void moderatorRevoked(String arg0) {  
  65.             // TODO Auto-generated method stub  
  66.   
  67.         }  
  68.   
  69.         @Override  
  70.         public void nicknameChanged(String participant, String newNickname) {  
  71.             System.out.println(StringUtils.parseResource(participant)+ " is now known as " + newNickname + ".");  
  72.         }  
  73.   
  74.         @Override  
  75.         public void ownershipGranted(String arg0) {  
  76.             // TODO Auto-generated method stub  
  77.   
  78.         }  
  79.   
  80.         @Override  
  81.         public void ownershipRevoked(String arg0) {  
  82.             // TODO Auto-generated method stub  
  83.   
  84.         }  
  85.   
  86.         @Override  
  87.         public void voiceGranted(String arg0) {  
  88.             // TODO Auto-generated method stub  
  89.   
  90.         }  
  91.   
  92.         @Override  
  93.         public void voiceRevoked(String arg0) {  
  94.             // TODO Auto-generated method stub  
  95.   
  96.         }  
  97.   
  98.     }  
阅读(2354) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~