openfire中实现好友添加及分组管理。
主要基于两张table实现:ofroster,ofrostergroups。
ofroster:用于记录好友关系(一对好友关系用两条记录来实现)
ofrostergroups:用于记录好友分组
特别说明:openfire中用户的主键是自然主键,也就是username。没有使用自增ID。
我们先来看一下官方(http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/database-guide.html)对 两张表的描述:
ofRoster (好友列表)
列名 | 类型 | 长度 | 描述 |
rosterID | NUMBER | n/a | 编号名册(主键) |
username | VARCHAR | 32 | 用户名 |
jid | TEXT | n/a | 地址名册入境 |
sub | NUMBER | n/a | 认购地位入境 |
ask | NUMBER | n/a | 卖出地位入境 |
recv | NUMBER | n/a | 检举表明进入名册收到请求 |
nick | VARCHAR | 255 | 昵称分配给这个名册入境 |
ofRosterGroups (组的好友名单中的条目)
列名 | 类型 | 长度 | 描述 |
rosterID | NUMBER | n/a | 名册编号(主键) |
rank | NUMBER | n/a | 立场项(主键) |
groupName | VARCHAR | 255 | 用户定义的名称,这个名册组 |
看不太明白?不要着急,我们慢慢分析。
假设有用户A,用户B。
当A申请加B为好友时(例如:A将B加入好亲人的分组中)。会在ofroster表中插入两条记录,
rosterID username jid sub ask recv nick
1 A 0 0 -1 B
2 B 0 -1 1 null
同时往ofrostergroups表中插入一条记录
rosterID rank groupName
1 0 亲人
这时B同意将A加为好友,并设置为家人分组中,那么会修改ofroster表中刚插入的两条记录,如下所示:
rosterID username jid sub ask recv nick
1 A 1 -1 1 B
2 B 2 0 -1 null
同时往ofrostergroups表中插入一条记录.
rosterID rank groupName
2 0 家人
到此为止,双方的好友关系便建立起来。
疑问:1.若B不同意呢?则不做任何操作。下一次,若B加A为好友,将等同于执行同意的操作。
2.如何查询某个人所有好友,和分组?
在ofroster中根据username便可获得某个用户的所有好友信息。然后根据每条记录的rosterid去ofrostergroups表中查找分组的名称即可。
3.当用户添加一个空的好友分组时,ofrostergroups表是否插入一条记录?
不插,测试发现并没有实质的插入一条记录,但用户可以看到这个分组名称,怎么回事?推测可能是存放在session中。测试发现当用户创建一个空的好友分组,然后下线,再上线时,发现该好友分组已消失。充分说明当好友分组为空时,并没有插库。
下面说一下每个字段所代表的含义:
askstatus
-1— 没有挂起的添加好友请求。
The roster item has no pending subscription requests.
0— 有挂起的添加好友请求。
The roster item has been asked for permission to subscribe to its presence but no response has been received.
1— 估计是有没有回复的删除请求吧
The roster owner has asked the roster item to be unsubscribed from its presence notifications but hasn't yet received confi rmation.
recvstatus
-1— 已经回复添加好友请求
There are no subscriptions that have been received but not presented to the user.
1— 接收到好友请求但是没有给好友回复
The server has received a subscribe request, but has not forwarded it to the user.
2— 估计是没有回复删除请求吧
The server has received an unsubscribe request, but has not forwarded it to the user.
substatus
-1— 应该删除这个好友
Indicates that the roster item should be removed.
0— 没有建立好友关系
No subscription is established.
1— 用户已经发出好友请求
The roster owner has a subscription to the roster item’s presence.
2— 收到好友请求并且加对方好友
The roster item has a subscription to the roster owner’s presence.
3— 好友已经相互添加
The roster item and the owner have a mutual subscription.
知道了这些之后也就大体明白了添加好友的过程,下面就是我们代码的操作
public static void main(String[] args) {
ResultSet rs = null;
Statement stmt = null;
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//new oracle.jdbc.driver.OracleDriver();
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.85:1521:ORCL", "test", "test");
stmt = conn.createStatement();
//aaa与eee互加好友
String sql="insert into OFROSTER values('30','eee','aaa@ppt03-20141024i','3','-1','-1','aaa')";
stmt.execute(sql);
String sql2="insert into OFROSTER values('31','aaa','eee@ppt03-20141024i','3','-1','-1','eee')";
stmt.execute(sql2);
//将aaa与eee放到Friend分组中
String sql3="insert into OFROSTERGROUPS values('30','0','Friend')";
stmt.execute(sql3);
String sql4="insert into OFROSTERGROUPS values('31','0','Friend')";
stmt.execute(sql4);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null) {
rs.close();
rs = null;
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这是我用JDBC直接操作数据库的操作,一开始好像不行,后来我又添加了openfire官方提供的一个插件:SubscriptionPlugin,这个插件的主要实现自动添加了好友的功能。添加完成之后就可以了。
有什么问题可以留言
分享到:
相关推荐
实现openfire与用户数据库集成 实现用户认证、用户查询
openfire添加好友流程梳理:unavailable, 下线;subscribe, 订阅;subscribed, 同意订阅;unsubscribe, 取消订阅;unsubscribed, 拒绝订阅;probe,探测;error;错误
openfire好友关系解析,包括数据包及数据库状态。
openfire自带数据库的字典,详细展示数据库的每个表的结构,并备注了每个字段的含义,对开发者有很好的帮助。
openfire添加好友离线请求推送
Openfire 表结构 数据字典 进行修改密码等操作请参考: Openfire用户密码的保存及加密、解密 http://blog.csdn.net/seeol/article/details/21638663
Openfire数据结构详解
openfire 脚本文件
[经典] Openfire SPARK 整合 扩展用户 用户组
自己写的获取所有在线用户的openfire插件,直接上传到openfire服务器即可使用,访问路径为host:port/plugins/onlines/listall
strophe注册插件,xmpp ,openfire服务器,带内注册
openfire的用户接收消息计数器,应用很方便,通过填写openfire的用户user_no号与密码,还有服务器的ip地址,点击登录就可以等待消息的接收,并且统计接收消息的数量.
openfire数据库模式指南,列出了其所有数据库表结构及说明
数据库字典,想了解的朋友。这个真的不错。openfire再次开发必备资料。
详细列出了即时通信服务端openfire数据库的表结构,包括表名字段名,字段属性,主外键等等
openfire框架数据字典(pdm格式)
NULL 博文链接:https://baobeituping.iteye.com/blog/1458842
代码里做了逻辑处理,会随机只返回3个,改下就可以了 访问路径 127.0.0.1:8080/plugins/onlineuser/getallusers
openfire聊天记录插件,含有mysql脚本,安装插件前现根据提供的mysql脚本建个表(其他数据库可根据mysql的样式自己建,很简单)
对Openfire进行扩展,支持在线指定聊天室和全部在线人员的查看。