首先是客戶端的登錄過程
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接口
-
context.send_to_client(role_list, proto, data)
!12 role_list為空則想所有在線玩家發送
role_list為一個列表,則想列表里的roleid發送
role_list為一個number(role_id)則向此玩家發送!
-
context.get_role_msgagent(role_id)
通過role_id獲取玩家的msgagent,使用時請對返回值做判斷,若為nil則role_id不在線,得到的msgagent信息與ctx差不多
后期工作
基於此架構,后期與單個玩家掛鈎的功能可以直接作為一個模塊掛在game的agent上,不用再另起服務(如聊天和彈幕),hall上只處理與多個玩家相關的邏輯(如排行榜、場景及商店等)