主要基于两张table实现:ofroster,ofrostergroups。
ofroster:用于记录好友关系(一对好友关系用两条记录来实现)
ofrostergroups:用于记录好友分组
特别说明:openfire中用户的主键是自然主键,也就是username。没有使用自增ID。
我们先来看一下官方(http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/database-guide.html)对 两张表的描述:
ofRoster (buddy rosters or lists)Column Name Type Length Description
rosterID | NUMBER | n/a | ID of roster (Primary Key) |
username | VARCHAR | 32 | User Name |
jid | TEXT | n/a | The address of the roster entry |
sub | NUMBER | n/a | The subscription status of the entry |
ask | NUMBER | n/a | The ask status of the entry |
recv | NUMBER | n/a | Flag indicating the entry is a roster request that was received |
nick | VARCHAR | 255 | The nickname assigned to this roster entry |
ofRosterGroups (Groups of buddy entries in a roster)Column Name Type Length Description
rosterID | NUMBER | n/a | Roster ID (Primary Key) |
rank | NUMBER | n/a | Position of the entry (Primary Key) |
groupName | VARCHAR | 255 | The user defined name for this roster group |
看不太明白?不要着急,我们慢慢分析。
假设有用户A,用户B。
当A申请加B为好友时(例如:A将B加入好亲人的分组中)。会在ofroster表中插入两条记录,
rosterID username jid sub ask recv nick
1 A B@192.168.1.102 0 0 -1 B
2 B A@192.168.1.102 0 -1 1 null
同时往ofrostergroups表中插入一条记录
rosterID rank groupName
1 0 亲人
这时B同意将A加为好友,并设置为家人分组中,那么会修改ofroster表中刚插入的两条记录,如下所示:
rosterID username jid sub ask recv nick
1 A B@192.168.1.102 1 -1 1 B
2 B A@192.168.1.102 2 0 -1 null
同时往ofrostergroups表中插入一条记录.
rosterID rank groupName
2 0 家人
到此为止,双方的好友关系便建立起来。
疑问:1.若B不同意呢?则不做任何操作。下一次,若B加A为好友,将等同于执行同意的操作。
2.如何查询某个人所有好友,和分组?
在ofroster中根据username便可获得某个用户的所有好友信息。然后根据每条记录的rosterid去ofrostergroups表中查找分组的名称即可。
3.当用户添加一个空的好友分组时,ofrostergroups表是否插入一条记录?
不插,测试发现并没有实质的插入一条记录,但用户可以看到这个分组名称,怎么回事?推测可能是存放在session中。测试发现当用户创建一个空的好友分组,然后下线,再上线时,发现该好友分组已消失。充分说明当好友分组为空时,并没有插库。
Notice the different status types? Here is a list of all of the different status types, witha brief description, also from the plugin's readme file.
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.
代码操作: PacketListener myListener = new PacketListener() { public void processPacket(Packet packet) { if(packet instanceof Message) { Message message = (Message) packet; String type = message.getType().toString(); if(type.equals("chat")) { //接收消息 if(message.getBody()!=null){ //保存信息到客户端数据库 } } } } else if(packet instanceof Presence) { Presence presence = (Presence) packet; String type = presence.getType().toString(); boolean b= TalkService.this.roster.contains(packet.getFrom()); Log.i(tag, b+""); Roster roster = connection.getRoster(); RosterEntry rosterEntry = roster.getEntry(presence.getFrom()); String itemType=""; if(rosterEntry!=null){ Log.e(tag, "PacketListener Presence: rosterEntry.getName()= "+rosterEntry.getName()+ " - rosterEntry.getUser()="+rosterEntry.getUser()+ " - rosterEntry.getStatus()="+rosterEntry.getStatus()+ " -rosterEntry.getType()= "+rosterEntry.getType()); itemType=rosterEntry.getType().toString(); } Log.e(tag, "itemType=="+itemType); if(type.equals("subscribe")) {//我收到对方的加好友的请求 //添加好友请求 FriendRelationParam param = new FriendRelationParam(); TalkCallback callback = new TalkCallback(); callback.from = getUId(presence.getFrom()); callback.to = getUId(presence.getTo()); try { param.callbackStr = callback.toJsonObject().toString(); } catch (Exception e) { e.printStackTrace(); } param.userId = Long.parseLong(callback.to); param.friendUid = Long.parseLong(callback.from); startFriendRelation(param); if("none".equals(itemType)){//收到对方的加好友的请求 Log.i(tag, "type="+type+" 我收到对方的加好友的请求"); } if("to".equals(itemType)){//我加对方好友后,对方同意,给我发回的交友请求 Log.i(tag, "type="+type+" 我加对方好友后,对方同意,给我发回的交友请求"); } }else if("subscribed".equals(type)){//对方同意加我为好友 if("both".equals(itemType)){//双方互为好友关系建立 Log.i(tag, "type="+type+" 双方互为好友关系建立!"); } Log.e("TalkService"+Thread.currentThread().getName(), presence.getFrom()+"同意了我["+packet.getTo()+"]的加好友请求 "); }else if(type.equals("unsubscribe")) {//对方发起了把我删除了||或者拒绝 //拒绝的时候只会走这A if("none".equals(itemType)){//拒绝 Log.i(tag, "type="+type+" 我被拒绝!!!"); } if("to".equals(itemType)){//我收到被对方删除 Log.i(tag, "type="+type+" 我收到被对方删除"); } }else if(type.equals("unsubscribed")) {//对方把我删除了 //删除的时候 会走A,同时再走一次这 if("none".equals(itemType)){// 我被删除 ,双方关系解除************************** Log.i(tag, "type="+type+" 我被删除的!!!"); } }else if(type.equals("available")) {//对方告诉我他在线 // presence = new Presence(Presence.Type.available); // presence.setTo(presence.getFrom()); // connection.sendPacket(presence); } }else if(packet instanceof AuthMechanism) { } } };
相关推荐
Linux环境下的openfire安装包,能够结合spark客户端进行即时通信
Android-XMPP-openfire-实现IM
openfire-4.3.0-1.x86_64.rpm, 为CentOS 安装 提供,开发即时消息使用
openfire是基于XMPP协议的即时通讯框架,spark是pc客户端应用,类似qq客户端。smack提供了与XMPP服务通信的开发库。
openfire-4.2.3-1.x86_64,linux版本,openfire4.2.3最新版本
openfire-4.5.0源码。openfire是一个基于XMPP协议通信聊天的即时通讯框架,欢迎大家下载!!
openfire的linux安装版本,下载以后将文件上传到linux某文件夹下面,然后敲“tar –xzvf openfire-3.6.2-1.i386.tar.gz mv openfire /opt”命令完成安装。完成安装以后再敲“/etc/init.d/openfire /etc/init.d/...
Android-Openfire-Smack4.1.2 使用入门
openfire服务端
博客有关于openfire4.5版本idea的导入,希望各位大佬多多关注 openfire4.5导入intellij idea的maven构建地址: https://blog.csdn.net/zlvszsl/article/details/104909825
建造先决条件:使用 Maven 2.2.1 从安装 maven-openfire-plugin 获取一份openfire.jar并将其安装到 maven 中。 有几种方法可以做到,这里有两种: 选项 1. 在下载您需要的 openfire 版本的源代码然后根据源代码路径...
openfire安装---及时聊天 、、、、
复现CVE-2023-32315
openfire red5 spark 详细二次开发包,公司内部进行通信的二次开发很好的哦
openfire老版本,3.7rpm版本,可以直接下载来用openfire老版本,3.7rpm版本,可以直接下载来用
Openfire 4.2.2 源码,需要使用mvn 命令编译后生成ecplise项目,在关联相关文件夹就行了。 Openfire is a real time collaboration (RTC) server licensed under the Open Source Apache License.
Pàdéfor Openfire该项目为Openfire提供了基于Web的统一通信解决方案。基于点对点的聊天,持续的群聊,音频,视频会议和实时流媒体,电话会议它包括第三方产品,特别是: 项目; 项目; Web客户端。 项目。基于项目...
开源的Java基于XMPP协议的即时通讯
快速运行它(使用 --net=host 因为需要公开大量端口并且 docker 最新版本 1.3.1 还不包括端口范围) docker run -d --name='openfire-jitsi' --net=host -e DOMAIN=YOUR_DOMAIN itech/openfire-jitsi:latest用法转...
该插件的功能对于需要在Openfire管理控制台之外管理Openfire的应用程序很有用。功能清单获取所有或特定用户的概述,并创建,更新或删除用户获取所有或特定组的概述,并创建,更新或删除组概述所有用户名册条目,并...