简单的加好友过程详解
简单拿 userA 和 userB 作为例子
首先这个好友系统是通用的好友系统
功能:
- 加好友
- 删好友
- 接收到好友申请
- 拒绝好友邀请
- 同意好友邀请
- 拉黑好友
实现逻辑是非常简单的,重要的是处理TimeOut以及用户体验的问题。
这个系统基于一些架构实现的功能,例如玩家自己的Model数据,变化会通知会客户端。在本人的项目中叫做ModelChange
(简单介绍ModelChange:例如客户端玩家升了一级,就通过协议发送至服务端,修改Model的数据加一级。发送的同时还会发送客户端数据的版本号 例如1.0。在服务端修改数据是一定会使用线程锁,防止多个线程同时访问操作同一数据的对象。在线程锁是不仅防止多访问,还会把当前PlayerDB
[我们把玩家系统,分类数据分成不同的Model写入不同的MySQL表中,这里玩家的等级就PlayerDB的一条数据] 的版本号加0.1,例如1.1。通过构建回馈包,回来的不仅有这条协议的返回数据。还有这个DB的数据,覆盖客户端的数据。客户端发现版本号发生变化就会调用这个PlayerDB对应的 ModelChange。这样就可以做到数据同步,UI的及时刷新等。)
首先定义一个玩家的 好友系统FriendDB,对应MySQL的一个表。
Model使用Proto定义,生成C#代码。
例如:
Message Friend
{
require uint32 UserBID = 1; //玩家的ID
require sint64 DealTime = 2;// 状态转化的时间戳
require FriendType FriendState = 3;//当前与该玩家的状态
}
enum FriendType
{
PF_NONE = 0; //默认
PF_ASKINGB = 1; // 准备加好友(未通知对方)(对于主动加的一方)
PF_WAITINGB = 2; //准备加好友(已通知对方)(对于主动加的一方)
PF_WAITINGME = 3; //有玩家申请加我 (对于被加的一方)
PF_NOMAL = 4; // 正常好友状态
PF_UNUSE = 5; //槽位为空(在服务端用List存储,所以姑且叫槽位)
PF_DELETEING = 6; // 删除状态(未通知对方)(对于主动加的一方)
PF_BLACK = 7; //拉黑
}