我的Openfire群实现思路:

1、群和群成员,要保存到表中。

2、拉取群列表和群成员列表,均从DB中查询返回。

3、抛弃老外的“进房间,要发Presence ”。只要此人一上线,就模似一个Presence进行joinRoom,进入他的各群房间。

多了解LocalMUCRoom 类中:public LocalMUCRole joinRoom(String nickname, String password, HistoryRequest historyRequest, LocalMUCUser user, Presence presence)

我的模似代码如下:

View Code

 1 /**
 2      * 模似用户进群(含呢称、含Precense、初始化角色LocalMUCRole)
 3      * @param roomId
 4      * @param packet
 5      * @return
 6      */
 7     public MUCRole getRolesByRoomId(long roomId, Packet packet)
 8     {
 9         MUCRole role = null;
10         try {
11             // Get or create the room  获取该群
12             MUCRoom room = server.getChatRoom(roomId, packet.getFrom());
13             
14             //从数据库中查询他的姓名作为昵称(得自己实现)
15             String nickname = new MUCRoomServiceDao().getUserNickname(packet.getFrom().getNode());
16             if(nickname == null)
17             {
18                 if(packet.getFrom().getResource() != null)
19                 {
20                     nickname = packet.getFrom().getResource();
21                 }
22                 else 
23                 {
24                     nickname = packet.getFrom().getNode();
25                 }
26             }
27             
28             HistoryRequest historyRequest = null;
29             String password = null;
30             
31             //构建成员进入群的Presence
32             Presence presence = new Presence();
33             presence.setTo(room.getJID().toBareJID() + "/" + nickname);    
34             presence.setFrom(packet.getFrom());
35             PacketExtension extension = new PacketExtension("x", http://jabber.org/protocol/muc);
36             presence.addExtension(extension);
37             
38             // The user joins the room 用户进入群
39             role = room.joinRoom(nickname,
40                     password,
41                     historyRequest,
42                     this,
43                     presence);
44             
45             // If the client that created the room is non-MUC compliant then
46             // unlock the room thus creating an "instant" room
47             //if (mucInfo == null && room.isLocked() && !room.isManuallyLocked()) {
48             if (room.isLocked() && !room.isManuallyLocked()) {
49                 room.unlock(role);
50                 //server.chatRoomAdded((LocalMUCRoom)room);
51             }
52             
53             addRole(roomId, (LocalMUCRole)role);//添加“用户在某个群中的角色”
54             
55         }
56         catch (UnauthorizedException e) {
57             sendErrorPacket(packet, PacketError.Condition.not_authorized);
58         }
59         catch (ServiceUnavailableException e) {
60             sendErrorPacket(packet, PacketError.Condition.service_unavailable);
61         }
62         catch (UserAlreadyExistsException e) {
63             sendErrorPacket(packet, PacketError.Condition.conflict);
64         }
65         catch (RoomLockedException e) {
66             sendErrorPacket(packet, PacketError.Condition.recipient_unavailable);
67         }
68         catch (ForbiddenException e) {
69             sendErrorPacket(packet, PacketError.Condition.forbidden);
70         }
71         catch (RegistrationRequiredException e) {
72             sendErrorPacket(packet, PacketError.Condition.registration_required);
73         }
74         catch (ConflictException e) {
75             sendErrorPacket(packet, PacketError.Condition.conflict);
76         }
77         catch (NotAcceptableException e) {
78             sendErrorPacket(packet, PacketError.Condition.not_acceptable);
79         }
80         catch (NotAllowedException e) {
81             sendErrorPacket(packet, PacketError.Condition.not_allowed);
82         }        
83         return role;
84     }

4、抛弃老外的“以昵称为Key 缓存群成员”。改为以帐号为Key。

多了解 LocalMUCRoom 类中:private Map<String,MUCRole> occupants = new ConcurrentHashMap<String, MUCRole>();

在joinRoom办法中:

View Code

1 //以JID作为缓存的key
2         JID userJid = user.getAddress();
3         if (userJid != null) {
4             occupants.put(userJid.toBareJID(), joinRole);
5         }

5、详细了解 LocalMUCRoom、LocalMUCUser、LocalMUCRole这三个类,各类中的数据成员、方法。

转载于:https://www.cnblogs.com/huazai8204/archive/2011/12/31/2309022.html

改造MUC实现Openfire群相关推荐

  1. 将Openfire中的MUC改造成类似QQ群一样的永久群

    一.思路 1.新建立永久房间,同时保证房间中的成员存储到"ofmucmember"表当中. 2.新建一个用户登陆监听的插件,这个插件监听用户的登陆行为,同时在用户登陆时查询&quo ...

  2. Android 将Openfire中的MUC改造成类似QQ群一样的永久群

    将Openfire中的MUC改造成类似QQ群一样的永久群 转载于:https://www.cnblogs.com/zhujiabin/p/5814914.html

  3. Openfire实现QQ群功能

    原文地址 前言 在使用Openfire + Asmack开发移动 IM 时发现Openfire中的会议室实现的功能并不像QQ群,不能保存离线用户,用户一旦断开连接,就会自动离开会议室.所以想通过开发插 ...

  4. 基于 OpenFire 的TVBox管理平台开发笔记

    目录 一.開發環境設置.... 3 1.1 JDK 安裝.... 3 1.2 MySql Server安裝.... 4 1.3 OpenFire安裝.... 6 1.4 Openfire Admin ...

  5. 使用群晖作mineportalbox(1):合理且不折腾地使用群晖硬件和套件

    本文关键字:群晖,mineportalbox 在前面<免租用云主机将mineportal2做成nas><使用树莓派和cloudwall打造个人云>中,我们从软硬结合的角度,提出 ...

  6. Greenplum集群部署和架构优化,我总结了5000字的心得

    这是学习笔记的第 2361篇文章 最近对离线数仓体系进行了扩容和架构改造,也算是一波三折,出了很多小插曲,有一些改进点对我们来说也是真空地带,通过对比和模拟压测总算是得到了预期的结果,这方面尤其值得一 ...

  7. Redis解决老项目集群Session共享案例与回顾

    老项目突然之间客户要用了而且用户量还不少,后端移动端都需要给升级.第一改进的时候做了移动端与后端的服务分流,这次升级为分布式集群模式.分布式集群模式需要解决Session共享问题和数据一致性分布式锁处 ...

  8. tigase集群配置搭建官方方法-xmpp通讯协议配备tigase集群开发简单省事-哇谷即时通讯IM源码服务-哇谷即时通讯源码

    tigase集群配置搭建官方方法-xmpp通讯协议配备tigase集群开发简单省事-哇谷即时通讯IM源码服务 哇谷即时通讯IM云-即时通讯源码-音视频会议-直播-短视频-企业即时通讯办公-聊天app- ...

  9. tigase mysql_即时通讯之服务端篇Tigase.

    摘要 xmpp是一个应用层协议,主要做网页版即时通讯,是基于RFC3920和RFC3921实现,服务端常见的框架有openfire,tigase,prosody等,这三个都亲自踩过坑,唯有tigase ...

最新文章

  1. 完整的Blender三维课程:素描到三维艺术的初学者
  2. ko文件卸载 linux_Linux驱动06 | 为什么使用内核模块?
  3. 4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍
  4. PHP学习笔记-字符串操作1
  5. java 自适应响应式 网站 源码 SSM 生成 静态化 手机 平板 PC
  6. gsu 2524 Frozen Rose-Heads
  7. pom.xml配置详解
  8. File,FileInfo,Directory,DirectoryInfo
  9. javascript 西瓜一期 15 数据的存储单位
  10. 容器编排技术 -- Kubernetes Labels 和 Selectors
  11. leetcode题解118-杨辉三角
  12. (转)Managed DirectX +C# 开发(入门篇)(五)
  13. 微软未来五年将把80%资源投入云计算
  14. RK G68三模说明书
  15. ACCESS使用技巧三则
  16. 测试鼠标传感器的软件,鼠标该怎么选择?给大家说下鼠标传感器的差距
  17. TCP BBR之Startup gain的另一种推导法以及最新进展
  18. 使用微信部署ChatGPT
  19. NC用友启动服务异常
  20. 手把手教会OpenGL之纹理贴图、包含纹理载入、纹理过滤、边界处理、纹理参数设置(入门级别案例,棋盘)

热门文章

  1. 《TCP/IP详解》学习笔记(三):IP协议、ARP协议
  2. layui 流加载flow遇到的问题
  3. html表情选择器,原生JS写的emoji表情选择器
  4. 工业炉温度计算机控制系统,热处理工业炉计算机控制系统组态王+PLC)
  5. 一道很简单的贪心算法题~【贪心:我不要脸的伐?】
  6. 约瑟夫环-(数组、循环链表、数学)
  7. Linux gitpush错误,linux – GIT:无法推送(奇怪的配置问题)
  8. 如何把word分装到两个byte_如何核对两个Word文档的内容差别?同事加班半小时,我只花了30秒...
  9. 每天30分钟:成功有效的学习方法
  10. 养不教 父母之过:10个不能靠老师解决的孩子教育问题