kbengine 登錄login過程

服務端部分:
1:服務端loginapp.cpp中“void Loginapp::login(Network::Channel* pChannel, MemoryStream& s)”被觸發, 這個函數進行了一系列的檢查,
確定合法後向dbmgr發送一個登陸請求包“(*pBundle).newMessage(DbmgrInterface::onAccountLogin);”, dbmgr也會進行一系列的檢查並將登陸結果返回到loginapp。

  1. void Loginapp::login(Network::Channel* pChannel, MemoryStream& s)
  2. {
  3.         ...
  4. ...
  5.         if(loginName.size() > ACCOUNT_NAME_MAX_LENGTH)
  6.         {
  7.                 INFO_MSG(fmt::format("Loginapp::login: loginName is too long, size={}, limit={}.\n",
  8.                         loginName.size(), ACCOUNT_NAME_MAX_LENGTH));
  9.                 
  10.                 _loginFailed(pChannel, loginName, SERVER_ERR_NAME, datas, true);
  11.                 s.done();
  12.                 return;
  13.         }
  14.  
  15.         if(password.size() > ACCOUNT_PASSWD_MAX_LENGTH)
  16.         {
  17.                 INFO_MSG(fmt::format("Loginapp::login: password is too long, size={}, limit={}.\n",
  18.                         password.size(), ACCOUNT_PASSWD_MAX_LENGTH));
  19.                 
  20.                 ...
  21. ...
  22. ...
  23.  
  24.  
  25.         // 向dbmgr查詢用戶合法性
  26.         Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject();
  27.         (*pBundle).newMessage(DbmgrInterface::onAccountLogin);
  28.         (*pBundle) << loginName << password;
  29.         (*pBundle).appendBlob(datas);
  30.         dbmgrinfos->pChannel->send(pBundle);
  31. }

複製代碼


1.1: loginapp得到dbmgr的登錄合法結果後向baseappmgr發送了分配網關(baseapp)請求(registerPendingAccountToBaseapp), 通常是負載較低的一個baseapp進程.

  1. void Loginapp::onLoginAccountQueryResultFromDbmgr(Network::Channel* pChannel, MemoryStream& s)
  2. {
  3.         ...
  4. ...
  5. ...
  6.         // 如果大於0則說明當前賬號仍然存活於某個baseapp上
  7.         if(componentID > 0)
  8.         {
  9.                 Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject();
  10.                 (*pBundle).newMessage(BaseappmgrInterface::registerPendingAccountToBaseappAddr);
  11.                 (*pBundle) << componentID << loginName << accountName << password << entityID << dbid << flags << deadline << infos->ctype;
  12.                 baseappmgrinfos->pChannel->send(pBundle);
  13.                 return;
  14.         }
  15.         else
  16.         {
  17.                 // 註冊到baseapp並且獲取baseapp的地址
  18.                 Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject();
  19.                 (*pBundle).newMessage(BaseappmgrInterface::registerPendingAccountToBaseapp);
  20.  
  21.                 (*pBundle) << loginName;
  22.                 (*pBundle) << accountName;
  23.                 (*pBundle) << password;
  24.                 (*pBundle) << dbid;
  25.                 (*pBundle) << flags;
  26.                 (*pBundle) << deadline;
  27.                 (*pBundle) << infos->ctype;
  28.                 baseappmgrinfos->pChannel->send(pBundle);
  29.         }
  30. }

複製代碼

1.2:baseappmgr最終返回所分配的baseapp的ip地址等信息,loginapp將其轉發給客戶端(登錄成功協議onLoginSuccessfully,包含baseapp的ip和端口信息)

  1. void Loginapp::onLoginAccountQueryBaseappAddrFromBaseappmgr(Network::Channel* pChannel, std::string& loginName, 
  2.                                                                                                                         std::string& accountName, std::string& addr, uint16 port)
  3. {
  4.         ...
  5. ...
  6. ...
  7.  
  8.         Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject();
  9.         (*pBundle).newMessage(ClientInterface::onLoginSuccessfully);
  10.         uint16 fport = ntohs(port);
  11.         (*pBundle) << accountName;
  12.         (*pBundle) << addr;
  13.         (*pBundle) << fport;
  14.         (*pBundle).appendBlob(infos->datas);
  15.         pClientChannel->send(pBundle);
  16.  
  17.         SAFE_RELEASE(infos);
  18. }

複製代碼

2: 客戶端插件得到返回結果後調用KBEngineApp.cs->login_baseapp()函數開始正式登錄到baseapp。

3:baseapp收到登錄請求

  1. void Baseapp::loginGateway(Network::Channel* pChannel, 
  2.                                                    std::string& accountName, 
  3.                                                    std::string& password)

複製代碼

進行了一系列的檢查,包括:賬號是否已經在線,是否可以在這裏登錄等等。
當檢查合法後,向dbmgr發送了一個查詢賬號信息的請求“DbmgrInterface::queryAccount”,dbmgr將查詢到的賬號數據(包括屬性等)返回到baseapp, Baseapp::onQueryAccountCBFromDbmgr
當函數結果爲合法時,根據配置中定義的賬號實體腳本名稱“g_serverConfig.getDBMgr().dbAccountEntityScriptType”創建了Account實體, 同時還創建了一個clientMailbox,賬號實體中調用clientMailbox->方法()即可與客戶端通訊了。
Account實體被創建後, 首先__init__被調用, 接着onEntitiesEnabled被調用, 此時實體正式可用了。

賬號登陸成功後, 客戶端Account.cs中會調用__init__() -> baseCall("reqAvatarList");來請求獲得角色列表,
UI.cs中onReqAvatarList得到結果

發佈了65 篇原創文章 · 獲贊 30 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章