改造MUC实现Openfire群

我的Openfire群实现思路:

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

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

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

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

    我的模似代码如下:

ExpandedBlockStart.gifView 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办法中:    

ExpandedBlockStart.gifView 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信

http://blog.csdn.net/whuancai/article/details/11994341 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 原文出自&#xff1a;http://blog.csdn.net/monkey_d_meng/article/details/5894910 尊重作者&#xff1a;MONKEY_D_MENG 最近一段时间&#xff0c;由…

14 Scroll 滚动搜索

Scroll的用法&#xff1a;第一次搜的时候&#xff0c;要指定 快照保留时间1min&#xff0c;分页的大小&#xff1a;2条/页&#xff1b;对于第一次搜索&#xff0c;ES会返回一个这个scroll的id&#xff1b;下次再搜的时候&#xff0c;就带着这个scrollid去搜就行了&#xff0c;不…

VS2008中使用JSONCPP方法小结

http://sourceforge.net/projects/jsoncpp/?sourcetyp_redirect C要使用JSON来解析数据&#xff0c;一般采用jsoncpp. 下载jsoncpp后&#xff0c;按ReadMe文档的说法是要先安装的&#xff0c;但是安装比较麻烦。然而事实上&#xff0c;我们并不需要安装&#xff0c;就可以直接…

如何在Windows下编译OpenSSL

OpenSSL是一个开源的第三方库&#xff0c;它实现了SSL&#xff08;Secure SocketLayer&#xff09;和TLS&#xff08;Transport Layer Security&#xff09;协议&#xff0c;被广泛企业应用所采用。对于一般的开发人员而言&#xff0c;在 http://slproweb.com/products/Win32Op…

《团队名称》第八次团队作业:Alpha冲刺day5

项目内容这个作业属于哪个课程2016计算机科学与工程学院软件工程(西北师范大学)这个作业的要求在哪里实验十二 团队作业8—软件测试与ALPHA冲刺团队名称快活帮作业学习目标 &#xff08;1&#xff09;掌握软件测试基础技术。 &#xff08;2&#xff09;学习迭代式增量软件开发过…

(转)C# 把我所积累的类库全部分享给博友(附件已经上传)

http://files.cnblogs.com/LsGW/Common.zip转载于:https://www.cnblogs.com/meetrice/archive/2012/01/02/2310428.html

前端的小图标获取

搜索iconfont&#xff0c;里面有很多图标&#xff0c;鼠标移到想要的图标上&#xff0c;然后点击一个类似购物车的图标&#xff0c;然后添加到项目&#xff0c;下载到本地&#xff0c;有一个使用指南的html&#xff0c;然后参照上面的改就好。 把下载好的.css和.eot文件拖到css…

$JavaScript(3)

41、渐进增强和优雅降级 渐进增强 &#xff1a;针对低版本浏览器进行构建页面&#xff0c;保证最基本的功能&#xff0c;然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。 优雅降级 &#xff1a;一开始就构建完整的功能&#xff0c;然后再针对低版本浏…

转:Yupoo(又拍网)的系统架构

Yupoo!&#xff08;又拍网&#xff09; 是目前国内最大的图片服务提供商&#xff0c;整个网站构建于大量的开源软件之上。以下为其使用到的开源软件信息&#xff1a; 操作系统&#xff1a;CentOS、MacOSX、Ubuntu 服务器&#xff1a;Apache、Nginx、Squid 数据库&#xff1a;…

浏览器搜索功能的使用

浏览器搜索功能的使用 直接在地址栏中搜索你需要的内容 用浏览器的搜索栏进行搜索 用双引号 " " 进行搜索 转载于:https://www.cnblogs.com/GaoNa/p/11061066.html

有趣的反直觉的“三门问题”

————— 第二天 ————— ———————————— 如何进行分析呢&#xff1f;我们不妨回到问题的起点&#xff0c;也就是参与者即将进行初次选择&#xff0c;主持人还没有打开一扇空门的时候。 从上图可以看出&#xff0c;我们总共面临着6种不同的子局面。这些子局面的…

转使用Moq让单元测试变得更简单

【ASP.Net MVC3 】使用Moq让单元测试变得更简单 前几天调查完了unity。现在给我的任务是让我调查Moq。 以下是自己找了资料&#xff0c;总结并实践的内容。如果有表述和理解错误的地方。恳请指正。 什么是Moq&#xff1f; Moq&#xff08;英语发音是Mock-you 或者只是mock&…

Web Service实现分布式服务的基本原理

简单的说&#xff0c; 就是客户端根据WSDL 生成 SOAP 的请求消息&#xff0c; 通过 HTTP 传输方式&#xff08;也可以是其它传输方式&#xff0c; 如 FTP 或STMP 等&#xff0c;目前 HTTP 传输方式已经成为 J2EE Web Service 的标准&#xff09;传给对方&#xff0c; 服务方实现…

使用docker部署mysql主从复制集群

一、环境搭建 虚拟机环境&#xff1a;centos7 IP:192.168.37.134 用户名&#xff1a;root 密码&#xff1a;123 启动3个容器&#xff0c;一个是master&#xff0c;端口是3307&#xff0c;另外两个是slaver&#xff0c;端口是3308和3309 docker pull mysql:5.7docker run -p …

特殊的质数肋骨

特殊的质数肋骨 时间限制: 0 Sec 内存限制: 128 MB题目描述 农民约翰的母牛总是生产出最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。 农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质…

学滑冰

为什么80%的码农都做不了架构师&#xff1f;>>> http://www.cnr.cn/wcm/zhuanti/harb/bxyd/t20041230_163420.html 学滑冰&#xff08;一&#xff09; 到冰场上穿冰刀奔驰豪情一番&#xff0c;真是今人激情万千&#xff0c;你会滑冰吗&#xff1f;如果你还不会滑冰…

Java-Redis 热部署问题

项目请求时报错&#xff1a;java.lang.ClassCastException: cn.xingaohbd.seckil.model.User cannot be cast to cn.xingaohbd.seckil.model.User at cn.xingaohbd.seckil.service.impl.UserServiceImpl.getUser(UserServiceImpl.java:33) ~[classes/:na] at cn.xingaohbd.seck…

vs2013编译boost1.55.0 32/64位

在使用vs2013编译boost-1.55.0之前&#xff0c;先要给boost做下修改&#xff1a; boost_1_55_0\boost\intrusive\detail\has_member_function_callable_with.hpp line:222 template<class U> static BOOST_PP_CAT(zeroarg_checker_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION…

ICE简单介绍及使用示例

1、ICE是什么&#xff1f; ICE是ZEROC的开源通信协议产品&#xff0c;它的全称是&#xff1a;The Internet Communications Engine&#xff0c;翻译为中文是互联网通信引擎&#xff0c;是一个面向对象的中间件&#xff0c;使我们能够以最小的代价构建分布式应用程序。ICE使我们…

AtCoder Grand Contest 017

AtCoder Grand Contest 017 A - Biscuits 有\(n\)个数&#xff0c;问有多少个集合的数的和模\(2\)余\(P\)。 随便\(dp\)一下就好了。 #include<iostream> #include<cstdio> using namespace std; #define ll long long inline int read() {int x0;bool tfalse;char…