您的位置:首页 > 其它

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

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

大厅好友解决方案包括:

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

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

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

下面以一款在市面上功能强大的SDK为例做功能实现说明。详情可咨询bbs.anychat.cn

客户端API接口:

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

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

// 获取用户好友ID列表

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

// 获取好友在线状态

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

// 获取用户分组ID列表

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

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

BRAC_API DWORD BRAC_GetGroupFriends(DWORD dwGroupId, LPDWORD lpUserIDArray, DWORD& dwUserNum);

// 获取用户信息

BRAC_API DWORD BRAC_GetUserInfo(DWORD dwUserId, DWORD dwInfoId, TCHAR* lpInfoName, DWORD dwLen);

// 获取用户分组名称

BRAC_API DWORD BRAC_GetGroupName(DWORD dwGroupId, TCHAR* lpGroupName, DWORD dwLen);

服务器端的API接口:

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

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

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

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

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

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

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

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

// 设置用户的详细信息

BRAS_API DWORD BRAS_SetUserInfo(DWORD dwUserId, DWORD dwInfoId, LPCTSTR lpInfoValue, DWORD dwFlags=0);

// 获取用户的详细信息

BRAS_API DWORD BRAS_GetUserInfo(DWORD dwUserId, DWORD dwInfoId, TCHAR* lpInfoValue, DWORD dwSize);

// 用户信息控制

BRAS_API DWORD BRAS_UserInfoControl(DWORD dwUserId, DWORD dwCtrlCode, DWORD wParam=0, DWORD lParam=0, LPCTSTR lpStrValue=NULL);


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

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

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

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

复制代码
一、添加用户分组

DWORD dwGroupId = 1;

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

dwGroupId = 2;

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

复制代码
二、添加用户好友

DWORD dwFriendUserId = 10010;

BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_ADDFRIEND, dwFriendUserId);

dwFriendUserId = 10011;

BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_ADDFRIEND, dwFriendUserId );

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

DWORD dwGroupId = 1;

DWORD dwFriendUserId = 10010;

BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SETGROUPRELATION, dwGroupId, dwFriendUserId);

dwGroupId = 2;

dwFriendUserId = 10011;

BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SETGROUPRELATION, dwGroupId, dwFriendUserId);

复制代码
四、设置用户信息(用户资料)

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

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

……

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

BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SYNCDATA, 0, 0);

复制代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: