即时通讯 好友列表业务逻辑详解

在IM通讯中,通常需要管理自己的小伙伴,经常联系的,重要的用户需要标识在同一用户列表里,方便自己快速联系以及查看好友动态。那么如何可以做到类似QQ的好友列表功能呢,如

大厅好友解决方案包括:

1、业务服务器可以设置用户的好友列表,客户端可以获得好友列表,不需要进入房间;

2、客户端可以获得好友上线、下线的状态通知;

3、业务服务器可以自定义设置用户的任意属性(如名称、签名、性别、备注等)并能同步到客户端,客户端可以获取业务服务器自定义的用户属性;

下面以一款在市面(佰锐上科技)功能强大的SDK为例做功能实现说明,

客户端API接口:

1.    #define WM_GV_USERINFOUPDATE   WM_GV + 16               ///<
用户信息更新通知,wParam(INT)表示用户ID号,lParam(INT)表示更新类别

2.    #define WM_GV_FRIENDSTATUS     WM_GV + 17               ///<
好友在线状态变化,wParam(INT)表示好友用户ID号,lParam(INT)表示用户的当前活动状态:0
离线, 1
上线

3.

4.    //
获取用户好友ID列表

5.    BRAC_API DWORD BRAC_GetUserFriends(LPDWORD lpUserIDArray, DWORD&dwUserNum);

6.    //
获取好友在线状态

7.    BRAC_API DWORD BRAC_GetFriendStatus(DWORD dwFriendUserId, DWORD&dwStatus);

8.    //
获取用户分组ID列表

9.    BRAC_API DWORD BRAC_GetUserGroups(LPDWORD lpGroupIDArray, DWORD&dwGroupNum);

10.  //
获取分组下面的好友列表

11.  BRAC_API DWORDBRAC_GetGroupFriends(DWORD dwGroupId, LPDWORD lpUserIDArray, DWORD&dwUserNum);

12.  //
获取用户信息

13.  BRAC_API DWORDBRAC_GetUserInfo(DWORD dwUserId, DWORD dwInfoId, TCHAR* lpInfoName, DWORDdwLen);

14.  //
获取用户分组名称

15.  BRAC_API DWORD BRAC_GetGroupName(DWORDdwGroupId, TCHAR* lpGroupName, DWORD dwLen);

服务器端的API接口:

1.    //
用户信息控制类型定义(API:BRAS_UserInfoControl
传入参数、OnUserInfoControl回调参数)

2.    #define BRAS_USERINFO_CTRLCODE_KICKOUT         1         ///<
将指定用户从系统中踢掉

3.    #define BRAS_USERINFO_CTRLCODE_SYNCDATA        2         ///<
将指定用户的数据同步给客户端

4.

5.    #define BRAS_USERINFO_CTRLCODE_ADDGROUP        20        ///<
添加用户分组,wParam为分组Id,lpStrValue为分组名称

6.    #define BRAS_USERINFO_CTRLCODE_DELGROUP        21        ///<
删除用户分组,wParam为分组Id

7.    #define BRAS_USERINFO_CTRLCODE_ADDFRIEND       22        ///<
添加用户好友,wParam为好友Id

8.    #define BRAS_USERINFO_CTRLCODE_DELFRIEND       23        ///<
删除用户好友,wParam为好友Id

9.    #define BRAS_USERINFO_CTRLCODE_SETGROUPRELATION 24       ///<
设置好友与分组的关联关系,wParam为分组Id,lParam为好友Id,表示好友属于某个分组

10.

11.

12.  //
设置用户的详细信息

13.  BRAS_API DWORDBRAS_SetUserInfo(DWORD dwUserId, DWORD dwInfoId, LPCTSTR lpInfoValue, DWORDdwFlags=0);

14.  //
获取用户的详细信息

15.  BRAS_API DWORDBRAS_GetUserInfo(DWORD dwUserId, DWORD dwInfoId, TCHAR* lpInfoValue, DWORDdwSize);

16.  //
用户信息控制

17.  BRAS_API DWORD BRAS_UserInfoControl(DWORDdwUserId, DWORD dwCtrlCode, DWORD wParam=0, DWORD lParam=0, LPCTSTRlpStrValue=NULL);

服务器端业务逻辑处理流程


在用户登录成功事件中设置用户的好友列表、分组列表、用户属性,并发送数据同步指令:

1.     //
用户登录成功回调函数定义

2.     typedef void (CALLBACK* BRAS_OnUserLoginAction_CallBack)(DWORD dwUserId, LPCTSTR szUserName, DWORD dwLevel, LPCTSTR szIpAddr, LPVOID lpUserValue);

复制代码

一、添加用户分组

1.     DWORD dwGroupId = 1;

2.     BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_ADDGROUP,  dwGroupId, 0, "我的好友");

3.     dwGroupId = 2;

4.     BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_ADDGROUP,  dwGroupId, 0, "公司同事");

复制代码

二、添加用户好友

1.     DWORD dwFriendUserId = 10010;

2.     BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_ADDFRIEND,  dwFriendUserId);

3.     dwFriendUserId = 10011;

4.     BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_ADDFRIEND,  dwFriendUserId );

复制代码

三、设置好友与分组的关系(即好友属于哪一个分组)

1.     DWORD dwGroupId = 1;

2.     DWORD dwFriendUserId = 10010;

3.     BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SETGROUPRELATION,  dwGroupId, dwFriendUserId);

4.     dwGroupId = 2;

5.     dwFriendUserId = 10011;

6.     BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SETGROUPRELATION,  dwGroupId, dwFriendUserId);

复制代码

四、设置用户信息(用户资料)

1.     BRAS_SetUserInfo(dwUserId, 1, "我的签名");

2.     BRAS_SetUserInfo(dwUserId, 2, "020-85276986");

3.     ……

复制代码

五、将前面设置的资料同步给客户端

1.     BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SYNCDATA,  0, 0);

复制代码

时间: 2024-08-29 05:51:24

即时通讯 好友列表业务逻辑详解的相关文章

即时通讯技术 好友列表业务逻辑详解

在IM通讯中,通常需要管理自己的小伙伴,经常联系的,重要的用户需要标识在同一用户列表里,方便自己快速联系以及查看好友动态.那么如何可以做到类似QQ的好友列表功能呢,如 大厅好友解决方案包括: 1.业务服务器可以设置用户的好友列表,客户端可以获得好友列表,不需要进入房间: 2.客户端可以获得好友上线.下线的状态通知: 3.业务服务器可以自定义设置用户的任意属性(如名称.签名.性别.备注等)并能同步到客户端,客户端可以获取业务服务器自定义的用户属性: 下面以一款在市面上功能强大的SDK为例做功能实现

音视频即时通讯—视频呼叫业务逻辑流程

  视频呼叫业务逻辑主要实现两个终端PC.手机.Pad等之间的通话请求流程控制包括请求Request.回复Reply.开始Start以及结束Finish等过程可以形象理解为打电话的流程拨号.等待.通话.挂断. 以下以AnyChat视频呼叫业务逻辑为例说明 1.业务逻辑流程图 请参考http://bbs.anychat.cn/forum.php?mod=viewthread&tid=150&extra=page%3D1 2.API接口及常量定义 客户端相关API接口及事件回调 //视频通话消

在线客服 视频呼叫业务逻辑详解

视频呼叫业务逻辑主要实现两个终端(PC.手机.Pad等)之间的通话请求流程控制,包括请求(Request).回复(Reply).开始(Start)以及结束(Finish)等过程,可以形象理解为打电话的流程:拨号.等待.通话.挂断. 以下以Chat视频呼叫业务逻辑为例说明: 1.业务逻辑流程图 请参考 http://bbs.anychat.cn/forum.php?mod=viewthread&tid=150&extra=page%3D1 2.API接口及常量定义 客户端相关API接口及事件

业务逻辑详解

不同的项目有不同的功能,不同的功能需要不同的实现,实现这些核心功能的代码就叫业务逻辑 比如让你实现一个功能,给你两个数,让你获取它的和,你所写的如何才能获得任意给定的两个数的和,这个程序实现过程即可成为业务逻辑处理. "一个人了解的业务逻辑越多越细,他就是越好的需求分析师." 难题:什么是业务逻辑? 业务是指一个实体单元向另一个实体单元提供的服务.逻辑是指根据已有的信息推出合理的结论的规律. 业务逻辑是指一个实体单元为了向另一个实体单元提供服务,应该具备的规则与流程. 就像你家的规矩–

Vue.js学习之条件v-if和列表循环v-for详解

本文将继续和大家分享Vue.js的基础知识,主要是介绍Vue.js的条件v-if和列表循环v-for的相关使用,一起来看看吧,希望可以帮助大家更好的学习Vue.js. v-if .v-else.v-show.还可以使用template <div v-if="ok">ok</div> <div v-else>No</div> <div v-show="ok">ok</div> <templa

列表插件的详解

此列表插件,是用来显示后台的大数据的.比如:后台有几万条数据,需要一列一列的显示出来.但是由于是插件,所以应该能兼容各种数据的展示.有些数据的选项多,有些数据后面需要操作的按钮(操作的按钮也有可能是多个).废话不说,直接上代码. function List (options) { this.dataResoure = options.dataResoure;      //数据源,要显示的数据 this.key = options.key;                //主键; this.o

list(列表)功能详解

class list(object):    """    list() -> new empty list    list(iterable) -> new list initialized from iterable's items    """    def append(self, p_object): # real signature unknown; restored from __doc__        "&

DedeCMS系统函数列表及用法详解

织梦(DedeCMS)系统V5.7开始,函数大多数是以“小助手”的模式封装,进行按需加载,存放路径为: /include/helpers/ GetOneArchive($id) 函数作用:主要用于获取指定的某篇文档的各个信息,它返回的是一个数组. 参数含义: $id 传递某篇文档的ID号: 返回解释:本函数将返回一个数组,该数组包含了所有的文档元素. 相关链接:百度百科关于函数的解释:http://baike.baidu.com/view/15061.htm#2 GetChannelTable(

Python list(列表)功能详解

Python List append()方法 描述 append() 方法用于在列表末尾添加新的对象. 语法 append()方法语法: list.append(obj) 参数 obj -- 添加到列表末尾的对象. 返回值 该方法无返回值,但是会修改原来的列表. 实例 以下实例展示了 append()函数的使用方法: #!/usr/bin/python aList = [123, 'xyz', 'zara', 'abc']; aList.append( 2009 ); print "Update