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

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

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

一、创建会议室

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

需要配置更多信息,可以到 http://xmpp.org/extensions/xep-0045.html  中15.5.3 muc#roomconfig FORM_TYPE 查看配置

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

[java] view
plain
copy

  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<FormField> 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<String> owners = new ArrayList<String>();
  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. }

二、加入会议室

[java] view
plain
copy

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

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

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

[java] view
plain
copy

  1. /**
  2. * 查询会议室成员名字
  3. * @param muc
  4. */
  5. public static List<String> findMulitUser(MultiUserChat muc){
  6. List<String> listUser = new ArrayList<String>();
  7. Iterator<String> 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. }

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

[java] view
plain
copy

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

五、监听会议室的消息

添加会议室消息监听 :

[java] view
plain
copy

  1. multiChat.addMessageListener(new multiListener());
[java] view
plain
copy

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

六、发送会议室消息

[java] view
plain
copy

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

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

添加监听事件:

[java] view
plain
copy

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

会议室状态监听事件:

[java] view
plain
copy

  1. /**
  2. * 会议室状态监听事件
  3. *
  4. * @author Administrator
  5. *
  6. */
  7. class ParticipantStatus implements ParticipantStatusListener {
  8. @Override
  9. public void adminGranted(String arg0) {
  10. // TODO Auto-generated method stub
  11. }
  12. @Override
  13. public void adminRevoked(String arg0) {
  14. // TODO Auto-generated method stub
  15. }
  16. @Override
  17. public void banned(String arg0, String arg1, String arg2) {
  18. // TODO Auto-generated method stub
  19. }
  20. @Override
  21. public void joined(String participant) {
  22. System.out.println(StringUtils.parseResource(participant)+ " has joined the room.");
  23. }
  24. @Override
  25. public void kicked(String arg0, String arg1, String arg2) {
  26. // TODO Auto-generated method stub
  27. }
  28. @Override
  29. public void left(String participant) {
  30. // TODO Auto-generated method stub
  31. System.out.println(StringUtils.parseResource(participant)+ " has left the room.");
  32. }
  33. @Override
  34. public void membershipGranted(String arg0) {
  35. // TODO Auto-generated method stub
  36. }
  37. @Override
  38. public void membershipRevoked(String arg0) {
  39. // TODO Auto-generated method stub
  40. }
  41. @Override
  42. public void moderatorGranted(String arg0) {
  43. // TODO Auto-generated method stub
  44. }
  45. @Override
  46. public void moderatorRevoked(String arg0) {
  47. // TODO Auto-generated method stub
  48. }
  49. @Override
  50. public void nicknameChanged(String participant, String newNickname) {
  51. System.out.println(StringUtils.parseResource(participant)+ " is now known as " + newNickname + ".");
  52. }
  53. @Override
  54. public void ownershipGranted(String arg0) {
  55. // TODO Auto-generated method stub
  56. }
  57. @Override
  58. public void ownershipRevoked(String arg0) {
  59. // TODO Auto-generated method stub
  60. }
  61. @Override
  62. public void voiceGranted(String arg0) {
  63. // TODO Auto-generated method stub
  64. }
  65. @Override
  66. public void voiceRevoked(String arg0) {
  67. // TODO Auto-generated method stub
  68. }

openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等的更多相关文章

  1. openfire Android学习(六)----总结

    Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...

  2. android学习三---创建第一个程序

    1.创建一个Helloworld程序 1.1 new-android application 点击file-new-android application出现如下界面 填上应用名,项目名,包名,选择所 ...

  3. openfire Android学习(一)----实现用户注册、登录、修改密码和注销等

    以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...

  4. android学习七(创建自己定义控件)

    前面学习的是android的基本控件和布局的使用,可是主要的控件和布局有时候并不能实现复杂的布局.我们来看下各种控件和布局的关系. 可见全部的控件都是直接或者间接的继承自View的,全部的布局都是直接 ...

  5. openfire Android学习(五)------连接断开重连

    首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionCl ...

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

    一.单人聊天 1)发送消息: 首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取 [java] view plainco ...

  7. openfire Android学习---android客户端聊天开发之登录 和 注销登录

    一切就绪,新建一个android测试工程: 上网权限配置,界面绘制啥的,这里就不说了. 首先 导入一个smark包.这个是用来维护长连接的,也可以是asmark.我用的是asmark 先普及一些基本知 ...

  8. Android学习三:线程操作

    作为Android开发的组成部分,多线程的作用举足轻重,先来说说应用场景 1多线程使用场景 1.1正常使用中,经常有子线程来更新界面UI的需求,但是安卓不允许子线程更新UI 使用子线程处理UI,若线程 ...

  9. android学习-2 (AVD 创建)

    在Android studio的tools下选择AVD manager 按照指示选择相应的硬件和系统映像. 在模拟器中运行应用 选择RUN APP 选择RUN时,并不只运行应用,还会处理运行应用所需要 ...

随机推荐

  1. JQuery根据字母检索元素并导航到指定位置

    介绍:类似于实现ios通讯录中右侧字母,快速导航到联系人的效果,如图: Html代码如下,分别是字母和港星名字的排序: <input type="text" id=" ...

  2. POJ1719二分匹配

    第一次发文,就是一些学习的心得而已,自己忘得时候就可以来看看,好了废话不多说,直接说说这题的思路. 题意大概是每列只能射中一个白格子,每行可以射多个,让你输出这样的序列,明显的二分图求匹配,用列去选行 ...

  3. THUSC2019游记

    Day 0 完全没有明明是最后一次机会的紧张感.大概是滚粗的预兆. 住在西郊.房间好小. 和thupc前一样又有一场cometoj,好像又有小裙子了.upd:改成星空棒棒糖! Day 1 早餐有点棒. ...

  4. Leetcode13--->罗马数字转换为整数

    该算法是将罗马数字转换为整数,思路如下:比如IXX,使用临时变量temp保存上一个已经遍历的罗马数字,比如:遍历时是从后往前遍历的:1> 刚开始时,temp = 0; 遍历当前遍历到第一个X,则 ...

  5. 大数据学习——SparkStreaming整合Kafka完成网站点击流实时统计

    1.安装并配置zk 2.安装并配置Kafka 3.启动zk 4.启动Kafka 5.创建topic [root@mini3 kafka]# bin/kafka-console-producer. -- ...

  6. 大数据学习——sparkSql对接hive

    1.   安装mysql 2.   上传.解压.重命名 2.1.  上传 在随便一台有hadoop环境的机器上上传安装文件 su - hadoop rz –y 2.2.  解压 解压缩:apache- ...

  7. 大数据学习——sparkRDD

    https://www.cnblogs.com/qingyunzong/p/8899715.html 练习1:map.filter //通过并行化生成rdd val rdd1 = sc.paralle ...

  8. 零基础学 JavaScript 全彩版 明日科技 编著

    第1篇 基础知识 第1章 JavaScript简介 1.1 JavaScript简述 1.2 WebStorm的下载与安装 1.3 JavaScript在HTML中的使用 1.3.1 在页面中直接嵌入 ...

  9. python 获得列表中每个元素出现次数的最快方法

    import collections import numpy as np import random import time def list_to_dict(lst): dic = {} for ...

  10. # Linux 命令学习记录

    Linux 命令学习记录 取指定文件夹下的任意一个文件,并用vim打开 vi $(ls -l|grep "^-"|head -n 1|awk '{print $9}') 统计给定文 ...