改造MUC实现Openfire群
我的Openfire群实现思路:
1、群和群成员,要保存到表中。
2、拉取群列表和群成员列表,均从DB中查询返回。
3、抛弃老外的“进房间,要发Presence ”。只要此人一上线,就模似一个Presence进行joinRoom,进入他的各群房间。
多了解LocalMUCRoom 类中:public LocalMUCRole joinRoom(String nickname, String password, HistoryRequest historyRequest, LocalMUCUser user, Presence presence)
我的模似代码如下:
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办法中:
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群相关推荐
- 将Openfire中的MUC改造成类似QQ群一样的永久群
一.思路 1.新建立永久房间,同时保证房间中的成员存储到"ofmucmember"表当中. 2.新建一个用户登陆监听的插件,这个插件监听用户的登陆行为,同时在用户登陆时查询&quo ...
- Android 将Openfire中的MUC改造成类似QQ群一样的永久群
将Openfire中的MUC改造成类似QQ群一样的永久群 转载于:https://www.cnblogs.com/zhujiabin/p/5814914.html
- Openfire实现QQ群功能
原文地址 前言 在使用Openfire + Asmack开发移动 IM 时发现Openfire中的会议室实现的功能并不像QQ群,不能保存离线用户,用户一旦断开连接,就会自动离开会议室.所以想通过开发插 ...
- 基于 OpenFire 的TVBox管理平台开发笔记
目录 一.開發環境設置.... 3 1.1 JDK 安裝.... 3 1.2 MySql Server安裝.... 4 1.3 OpenFire安裝.... 6 1.4 Openfire Admin ...
- 使用群晖作mineportalbox(1):合理且不折腾地使用群晖硬件和套件
本文关键字:群晖,mineportalbox 在前面<免租用云主机将mineportal2做成nas><使用树莓派和cloudwall打造个人云>中,我们从软硬结合的角度,提出 ...
- Greenplum集群部署和架构优化,我总结了5000字的心得
这是学习笔记的第 2361篇文章 最近对离线数仓体系进行了扩容和架构改造,也算是一波三折,出了很多小插曲,有一些改进点对我们来说也是真空地带,通过对比和模拟压测总算是得到了预期的结果,这方面尤其值得一 ...
- Redis解决老项目集群Session共享案例与回顾
老项目突然之间客户要用了而且用户量还不少,后端移动端都需要给升级.第一改进的时候做了移动端与后端的服务分流,这次升级为分布式集群模式.分布式集群模式需要解决Session共享问题和数据一致性分布式锁处 ...
- tigase集群配置搭建官方方法-xmpp通讯协议配备tigase集群开发简单省事-哇谷即时通讯IM源码服务-哇谷即时通讯源码
tigase集群配置搭建官方方法-xmpp通讯协议配备tigase集群开发简单省事-哇谷即时通讯IM源码服务 哇谷即时通讯IM云-即时通讯源码-音视频会议-直播-短视频-企业即时通讯办公-聊天app- ...
- tigase mysql_即时通讯之服务端篇Tigase.
摘要 xmpp是一个应用层协议,主要做网页版即时通讯,是基于RFC3920和RFC3921实现,服务端常见的框架有openfire,tigase,prosody等,这三个都亲自踩过坑,唯有tigase ...
最新文章
- 完整的Blender三维课程:素描到三维艺术的初学者
- ko文件卸载 linux_Linux驱动06 | 为什么使用内核模块?
- 4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍
- PHP学习笔记-字符串操作1
- java 自适应响应式 网站 源码 SSM 生成 静态化 手机 平板 PC
- gsu 2524 Frozen Rose-Heads
- pom.xml配置详解
- File,FileInfo,Directory,DirectoryInfo
- javascript 西瓜一期 15 数据的存储单位
- 容器编排技术 -- Kubernetes Labels 和 Selectors
- leetcode题解118-杨辉三角
- (转)Managed DirectX +C# 开发(入门篇)(五)
- 微软未来五年将把80%资源投入云计算
- RK G68三模说明书
- ACCESS使用技巧三则
- 测试鼠标传感器的软件,鼠标该怎么选择?给大家说下鼠标传感器的差距
- TCP BBR之Startup gain的另一种推导法以及最新进展
- 使用微信部署ChatGPT
- NC用友启动服务异常
- 手把手教会OpenGL之纹理贴图、包含纹理载入、纹理过滤、边界处理、纹理参数设置(入门级别案例,棋盘)
热门文章
- 《TCP/IP详解》学习笔记(三):IP协议、ARP协议
- layui 流加载flow遇到的问题
- html表情选择器,原生JS写的emoji表情选择器
- 工业炉温度计算机控制系统,热处理工业炉计算机控制系统组态王+PLC)
- 一道很简单的贪心算法题~【贪心:我不要脸的伐?】
- 约瑟夫环-(数组、循环链表、数学)
- Linux gitpush错误,linux – GIT:无法推送(奇怪的配置问题)
- 如何把word分装到两个byte_如何核对两个Word文档的内容差别?同事加班半小时,我只花了30秒...
- 每天30分钟:成功有效的学习方法
- 养不教 父母之过:10个不能靠老师解决的孩子教育问题