文章目录
写在前面
登录时序图
流程分析
胡言乱语
写在前面
这个系列的博客,主要记录自己看CBE(原名KBE)源码的一些阅读笔记和心得,个人在看源码前比较喜欢先那那套源码做出个有可见性效果的产品demo来,然后根据demo在逐渐深入源码,所以在此之前先做了个联机版坦克大战,想先看看CBE怎么做游戏服务器的具体业务功能的,可以先瞅瞅之前的那三篇博客。
基于ComblockEngine+Unity的联机版坦克大战(一)
基于ComblockEngine+Unity的联机版坦克大战(二)
基于ComblockEngine+Unity的联机版坦克大战(三)
我主要是为了看源码,实现,所以后续的博客,我应该都主要写自己的源码阅读情况了~
登录时序图
先贴上一张新账号登录的时序图。
流程分析
一次登陆请求,从客户端发起,到服务器响应,涉及到至少5个进程间的交互通信。
Client最先向Loginapp发起登录请求
具体代码参见Loginapp::login
Loginapp会对账号名、消息包体数据做基本的合法性验证。
由于在之后的流程中需要dbmgr来完成角色数据从db的读取,以及baseappmgr和baseapp的响应,所以,在此,必须保证dbmgr和baseappmgr进程已经启动完毕。
对于这些进程的状态数据,CBE都是由Components这个单例类来维护。
Components::ComponentInfos* baseappmgrinfos = Components::getSingleton().getBaseappmgr();
if(baseappmgrinfos == NULL || baseappmgrinfos->pChannel == NULL || baseappmgrinfos->cid == 0)
{
datas = "";
_loginFailed(pChannel, loginName, SERVER_ERR_SRV_NO_READY, datas, true);
s.done();
return;
}
Q1: 如何避免用户连续多次发起登录请求?
一次完整的登录验证是需要一定时长的,在这个流程中如何避免多次流程的重入,只要在最开始的入口处做一次防重入处理就好。
在Loginapp中有一个pendingLoginMgr_对象,就是用来干这件事的,这个对象会将此账号的相关数据进行记录,这一类账号属于连上了服务器,但是还未处理完所有流程。维护这份数据,可以有效的避免一次登陆流程中,同一账号多次连续的请求,也可以为后续流程验证做准备。
PendingLoginMgr::PLInfos* ptinfos = pendingLoginMgr_.find(loginName);
if(ptinfos != NULL)
{
datas = "";
_loginFailed(pChannel, loginName, SERVER_ERR_BUSY, datas, true);

本文详细分析了KBEngine(CBE)源码中的角色账号登录流程,包括登录时序图、各组件间通信以及防重入处理。在流程中,Client向Loginapp发起请求,Loginapp验证账号合法性并调用Dbmgr进行数据库查询。Dbmgr使用线程池处理SQL交互,确保高效率。Baseappmgr负责负载均衡,选择合适的Baseapp进程处理账号信息。最终,Loginapp将Baseapp信息反馈给Client,完成登录过程。
最低0.47元/天 解锁文章
216

被折叠的 条评论
为什么被折叠?



