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的Android聊天软件开发,旨在为用户提供一个可以注册、登录、聊天、查找和添加好友的全方位沟通平台。 【描述】:“基于openfire的Android聊天软件,可注册 登陆 聊天 查找 添加好友” ...
总的来说,这款基于openFire服务器的聊天软件客户端,通过采用XMPP协议和Android的Fragment与ViewPager技术,为用户提供了一个功能丰富、操作简便的即时通讯平台,满足了现代用户对于聊天软件的基本需求和期望。...
这使得为用户组添加自定义属性成为可能,如组的权限设置等。 3. ofGroupUser: 这个表管理组成员,其中`groupName`和`username`作为主键,确保每个用户在每个组中的状态是唯一的。`administrator`字段指示用户是否为...
7. 数据存储:本地数据持久化,如用户信息、聊天记录等,通常使用SQLite数据库或ContentProvider实现。 8. UI设计:提供友好、直观的用户界面,包括聊天界面、联系人列表、消息通知等。 Android Studio集成与测试 ...
5. **添加好友**:在其他设备上重复以上步骤,新用户可以添加为好友,从而进行聊天和文件传输。 **后续开发与定制** Spark作为一个开源项目,允许企业根据自身需求进行二次开发。这可能包括但不限于修改用户界面、...
- 所有的客户端到客户端的信息传递都需要通过Openfire服务器作为中继,服务器直接与数据库连接,存储和检索用户数据。 - 当服务器接收到用户请求时,会立即返回确认信息,并创建一个新的线程来处理接收的数据。这个...
- 二维码生成与解析:集成开源的二维码库,如ZXing(Zebra Crossing),客户端可以生成自己的二维码用于分享账号,同时也能扫描其他用户的二维码来快速添加好友。 - 安全性考虑:在使用二维码时,需要确保数据的...
5. 处理其他XMPP功能,如添加好友、创建群组、管理在线状态等。 具体代码示例(SmackTestClient2可能包含的文件): 1. `XMPPConnection.java`:实现XMPP连接类,包括连接、断开、心跳保持等方法。 2. `...
- 客户可通过客户端添加工作组为好友并发起聊天。 - 客服人员收到聊天请求后,可选择接受或拒绝。 - 接受后,系统自动创建聊天室,双方进入客服聊天过程。 #### 四、XMPP协议解析 ##### 4.1 XMPP协议原理 XMPP...
AddFriendActivity添加好友页面,搜索仅仅是获取用户头像,申请添加好友,及接受好友添加请求并处理; CaptureActivity扫描二维码页面,扫描二维码功能; CatchCameraActivity视频通话页面,仅完成获取前置摄像头...
用户可以通过搜索ID或者扫描二维码添加好友,这需要客户端与服务器之间的交互。在服务器端,需要维护一个用户关系数据库,记录每个用户的ID和好友列表。在客户端,用户的好友列表需要实时更新,当有新的好友请求或...
- **系统功能**:该系统支持用户注册登录、添加好友、发送文本消息、接收消息通知等功能。 - **扩展性**:得益于XMPP协议的模块化设计,该系统可以方便地添加新的功能,如语音聊天、视频通话等。 - **安全性**:通过...
3. 数据库:存储用户信息、好友关系、聊天记录等数据。 三、关键组件与技术 1. Smack库:Android开发中常用的XMPP客户端库,提供API来处理连接、认证、发送和接收消息等操作。 2. Android Service:用于在后台持续...
* 好友添加:用户可以添加好友,以便与其他用户进行交流和学习。 * 视频播放:用户可以在线观看学习资源,提高知识水平。 * 资讯信息:用户可以第一时间了解计算机最新发展。 在系统实现中,本系统使用了Java语言...
4. **好友系统**:用户可以添加、删除好友,查看好友在线状态,发送好友请求等。这部分需要在服务器端维护好友关系表。 5. **群聊功能**:支持多人聊天,可以创建群组,邀请成员,发送群消息。 6. **语音与视频...
比如添加好友,删除好友XmppPresenceListener是本机收到好友消息的监听,比如添加好友,删除好友XmppConnection是xmpp基本操作的核心类,包括登录,注册,聊天,修改密码,好友管理,群组管理等等。PS:该项目是本人...
对于处理数据库与处理服务器相关操作属于M(Mode1),该层具体上依赖于自定义的服务类。 论文还对SoLoMoGlo(Social + Local + Mobile + Globa1)概念进行了介绍,SoLoMoGlo概念是指社交网络、位置服务、移动设备和...
- **数据持久化**:SQLite数据库用于存储用户信息、好友关系等本地数据。 - **网络请求**:使用HttpURLConnection、OkHttp或Retrofit等库进行HTTP请求,获取服务器数据。 - **异步处理**:使用AsyncTask、...
配合“手机端代码地址”,意味着该项目不仅提供了服务端的实现,还有一套与之交互的移动端应用,可以实现类似于微信的聊天、好友添加、群组等功能。这为开发者提供了一个完整的端到端解决方案,以便于理解和研究即时...