【轉】登錄流程


首先是客戶端的登錄過程

 

1、客戶端(client)連接登錄服(login) !

2、連接成功后client與login通過同樣的算法生成各自的密鑰並彼此交換,然后各自用自己和對方的密鑰生成一個密匙(secret),兩個secret必須是一樣的,否則服務端拋出錯誤,連接失敗

3、密匙驗證成功。client帶着用戶的登錄賬戶、登錄密碼、以及用戶選擇要登錄的服務器(目前不能選擇,由login分配)與secret一起encode后去login做登錄驗證。

4、login在decode client的賬戶信息后與數據庫中的信息驗證,有三種結果!!

  • 數據庫中無此賬號信息則自動注冊 返回成功

  • 數據庫中有此賬號信息但密碼錯誤 返回失敗

  • 數據庫中有此賬號信息且密碼正確 返回成功!!!

5、第4步失敗則給client返回錯誤碼,成功后(會先判斷玩家是否已經在線,如果是則先將其踢下線)則由login選定一個網關服(gate),並向其注冊一個玩家即將登陸的消息,gate回返回一個subid,然后login將此subid以及gate的ip、name發給cilent,至此,login的工作完成,接着主動關閉這條連接。

6、gate在收到login的登錄消息時會為該賬號啟動一個msgagent服務

7、client在收到login發來的gate的信息后會開始連接gate,然后將賬號名,gate的name、subid與secret打包發給gate做驗證

8、gate收到client發來的驗證信息后與本地的注冊列表進行對比驗證,然后給client返回驗證結果

9、client收到gate的驗證正確的結果后,與gate的連接正式建立!!!

下面是客戶端的消息流轉過程

 

1、client發送第一條業務請求獲取存檔信息,此時client的消息會經過webgateserver和webmsgserver后正確路由到對應的msgagent中

    注意獲取存檔的消息和進入游戲的消息是玩家還未進入游戲時發的,這兩條消息是在msgagent處理的。在收到enter_game消息后,msgagent會選擇一個gamenode讓其進入,玩家在進入game后會在msgagent上注冊他所在的gamenode,agentaddr以及role_id等一些信息

2、msgagent會根據協議以及玩家在msgagent上注冊的信息將數據正確的發送到對應的服務上,並會攜帶一個ctx

幾個注意點

 

1、廢棄了之前獲取玩家信息的借口"get_player_online_state",你想要的信息ctx里一般都有,如果沒有請告訴我,或者你自己加上

圖片描述

2、添加了兩個context接口

  1.  

    context.send_to_client(role_list, proto, data)

    !12 role_list為空則想所有在線玩家發送

    role_list為一個列表,則想列表里的roleid發送

    role_list為一個number(role_id)則向此玩家發送!

     

  2.  

    context.get_role_msgagent(role_id)

    通過role_id獲取玩家的msgagent,使用時請對返回值做判斷,若為nil則role_id不在線,得到的msgagent信息與ctx差不多

     

后期工作

 

基於此架構,后期與單個玩家掛鈎的功能可以直接作為一個模塊掛在game的agent上,不用再另起服務(如聊天和彈幕),hall上只處理與多個玩家相關的邏輯(如排行榜、場景及商店等)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM