`

openfire--好友管理

 
阅读更多

主要基于两张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) {
               
               
              }
              
             }      
         }; 

  

 

分享到:
评论

相关推荐

    Android-XMPP-openfire-实现IM

    - **状态管理**:展示用户在线状态,并能处理好友的在线/离线状态变化。 4. **MyXmpp项目**: - **源码解析**:MyXmpp可能是这个项目提供的示例代码,包含了Android客户端的具体实现,例如XMPP连接、消息处理、...

    openfire好友关系解析

    在 Openfire 中,好友关系管理是核心功能之一,涉及到数据包交换和数据库状态的更新。以下是对 Openfire 好友关系解析的详细解释: 一、好友关系建立 1. 用户请求添加好友时,如用户 tom 添加 hu 为好友,会发送一...

    openfire添加好友

    理解这些流程对于管理和调试Openfire的即时通讯功能至关重要。在实际应用中,开发者需要根据具体需求,适配和定制这些流程,以满足用户的特定交互体验。例如,可能会添加额外的权限验证、通知机制或其他业务逻辑。...

    openfire+smack即时通讯

    - **Openfire**:作为服务器端,Openfire处理用户的登录、认证、会话管理和消息路由。它还支持安全的TLS/SSL连接,保护用户数据的安全。 【压缩包子文件的文件名称列表】"TigerIM-master_new"可能是一个即时通讯...

    XMPP_OPenfire即时通讯IM-android版

    6. **添加好友**: 添加好友需要发送一个添加请求(`<presence type="subscribe">`),等待对方同意(`<presence type="subscribed">`)后,双方就可以互发消息了。 7. **修改密码**: 这个功能通常需要通过Openfire...

    基于openfire 仿QQ

    - 客户端需要实现登录注册、好友管理、群组功能、发送接收消息等功能,这些都涉及到Android的Activity、Fragment、Intent等组件的使用。 3. **Openfire集成**: - 开发者需要在Android客户端中集成Smack库,这是...

    基于openfire的android即时通信

    5. 好友与群组管理:支持添加好友、删除好友、创建群组、邀请成员等功能。 6. 在线状态显示:展示用户在线、离线、忙碌等状态,并能根据对方状态调整交互方式。 7. 数据存储:本地数据持久化,如用户信息、聊天记录...

    openfire 类似QQ客户端 本测试 聊天功能都是ok的

    综上所述,这个测试案例展示了如何使用Openfire、XMPP和Smack在Android平台上构建一个功能完善的即时通讯应用,其功能与QQ类似,涵盖了个人聊天、表情发送、图片分享、好友管理、群组聊天和消息提醒等多个方面。...

    基于openfire的安卓聊天软件

    5. **添加好友**:用户可以将其他用户添加到自己的联系人列表中,实现好友管理。这需要客户端发送请求到服务器,由服务器处理添加关系。 在实现这些功能时,开发者可能需要用到以下技术: - **Android SDK**:用于...

    openfire Im android 客户端

    3. **联系人管理**:用户可以查看和管理自己的联系人列表,添加新的好友,同时可以查看好友的状态,了解他们是否在线。 4. **群聊功能**:支持创建和参与群组聊天,方便团队协作或社交交流。 5. **离线消息**:...

    基于openfire XMPP的即时通讯客服端

    - 好友管理:用户可以添加、删除好友,查看好友在线状态,建立个人社交网络。 - 分组管理:用户可以创建和管理不同的联系人分组,方便组织和查找联系人。 - 群聊功能:支持创建多人聊天室,方便讨论组、班级等...

    Openfire 4.2.3+Smack 4.3.0最新安装包

    然后,开发者在客户端应用中集成Smack库,通过连接到Openfire服务器,实现用户的登录、注销、好友添加、消息收发等功能。在处理实时性要求高的场景时,还可以利用Smack的推送通知服务,保证即使在离线状态下也能及时...

    Android代码-基于openfire和smack的安卓xmpp客户端

    它提供了API,使开发者能够轻松地建立连接、登录、发送和接收消息、管理好友列表、处理在线状态以及实现推送通知等功能。在Android项目中集成Smack,需要在build.gradle文件中添加依赖,然后在代码中实例化XMPP连接...

    XMPP开发Openfire详细介绍

    - 客户可通过客户端添加工作组为好友并发起聊天。 - 客服人员收到聊天请求后,可选择接受或拒绝。 - 接受后,系统自动创建聊天室,双方进入客服聊天过程。 #### 四、XMPP协议解析 ##### 4.1 XMPP协议原理 XMPP...

    基于openfire + jwchat 的 WEB IM

    Openfire的核心功能包括用户管理、群组聊天、文件传输、多语言支持以及与外部系统的集成(如LDAP、Active Directory)。通过提供XMPP服务,Openfire使得应用程序可以轻松实现点对点或群组聊天功能。 **jwchat详解:...

    openfire3.8.2API

    5. **隐私和过滤**:`org.jivesoftware.openfire.roster.Roster` 类处理好友列表和隐私设置,允许用户控制谁可以看到他们的在线状态和消息。 6. **扩展和插件**:Openfire允许开发插件来扩展其功能。`org.jive...

    openfire xmpp协议源码

    《Openfire与XMPP协议在Android即时通讯中的应用解析》 Openfire是一款开源的服务器软件,它基于...在这个过程中,理解并掌握XMPP协议的核心概念,以及Openfire的服务器配置和管理,是提升开发效率和产品质量的关键。

    Openfire数据结构详解

    在Openfire中,数据存储是通过数据库实现的,而本文将深入解析Openfire数据库中的关键数据结构,以便理解其工作原理和管理方式。 1. **ofGroup**:这是用户组的数据表,用于存储用户组的信息。主键是`groupName`,...

    openfire表结构

    12. ofRosterGroups: 用于管理好友列表中的分组,`rosterID`和`groupName`是主键,`rank`表示组内的排序位置。 13. ofPrivacyList: 用户的隐私列表,`username`、`name`和`isDefault`字段表示用户名、列表名和是否...

Global site tag (gtag.js) - Google Analytics