五星麻將1客戶端登錄流程
前言
雖然只是在記錄學習經過,但是對於我來說要表述清楚整個邏輯也並非易事。於是我能做的就是儘量把整個思路詳實記錄下來,這樣即使表述不清也可以供人蔘考,就像代碼的執行過程的Review一樣。
因此,我大概就是通過這樣的Review來成文的,整個執行過程都可以通過Debug來確認重現。
關於ET整個框架,關於五星麻將,上一篇已經鋪墊差不多了,這一篇講整個登錄流程。
登錄流程
上一篇我們已經可以展示登錄界面了,如下圖所示:
我們通過資源加載流程也可以找到對應的預設:
UGUI的基本組件很簡單,沒有什麼好說的,當點下登錄按鈕就觸發連接服務器的方法Game.Scene.GetComponent<KCPUseManage>().LoginAndConnect(LoginType.Editor, mAccountInputField.text);
這裏使用的是編輯器模式,對應的方法在LoginPanelComponent.cs中。
邏輯比較簡單,如果是測試就使用醜陋的紅色登錄界面,如果是正式的就會使用微信登錄。當然,還有快捷登錄方式,也就是說用戶終端上已經記錄了登錄憑證,就通過憑證快速登錄了。
代碼就不復制了,UI的MVC模式也是老生常談的技術了,所以也不囉嗦了。
聯網登錄KCPUseManage
上篇講過事件機制,這裏跳過,直接上LoginAndConnect的代碼:
//登陸並連接
public async void LoginAndConnect(int loginType, string dataStr,bool isReconnection=false)
{
_UpLoginType = loginType;
_UpLoginDataStr = dataStr;
if (_mStateManage.pKCPNetWorkState == KCPNetWorkState.BebeingConnect|| _mStateManage.pKCPNetWorkState == KCPNetWorkState.Connect)
{
Log.Warning("正在連接 請不要重複連接 或已經成功連接");
}
try
{
_mStateManage.StartConnect();
//根據是否重連 註冊 連接成功 是連接失敗的事件
mSocketCantConnectCall = _mStateManage.ConnectFailure;//連接失敗
Action<G2C_GateLogin> connectSuccesAction = _mStateManage.ConnectSuccess;//連接成功
//如果是重連 更改一下回調
if (isReconnection)
{
mSocketCantConnectCall = _mStateManage.AgainConnectFailure;
connectSuccesAction = _mStateManage.AgainConnectSuccess;
}
Log.Debug("驗證服地址:"+ GameVersionsConfigMgr.Ins.ServerAddress);
// 創建一個ETModel層的Session
ETModel.Session session = ETModel.Game.Scene.GetComponent<NetOuterComponent>().Create(GameVersionsConfigMgr.Ins.ServerAddress);
// 創建一個ETHotfix層的Session, ETHotfix的Session會通過ETModel層的Session發送消息
Session realmSession = ComponentFactory.Create<Session, ETModel.Session>(session);
realmSession.session.GetComponent<SessionCallbackComponent>().DisposeCallback += RealmSessionDisposeCallback;
//登陸驗證服務器
R2C_CommonLogin r2CLogin =(R2C_CommonLogin)await realmSession.Call(new C2R_CommonLogin()
{
LoginType = loginType,
PlatformType = HardwareInfos.pCurrentPlatform,
DataStr = dataStr,
});
realmSession.Dispose();
if (!string.IsNullOrEmpty(r2CLogin.Message))
{
if (PlayerPrefs.HasKey(GlobalConstant.LoginVoucher))
{
PlayerPrefs.DeleteKey(GlobalConstant.LoginVoucher);//登陸失敗的話 如果有憑證 就刪除憑證
}
UIComponent.GetUiView<PopUpHintPanelComponent>().ShowOptionWindow(r2CLogin.Message,null, PopOptionType.Single);//顯示提示
UIComponent.GetUiView<LoadingIconPanelComponent>().Hide();//隱藏圈圈
_mStateManage.pKCPNetWorkState = KCPNetWorkState.Disconnectl;//狀態改爲斷開連接
Game.Scene.GetComponent<ToyGameComponent>().StartGame(ToyGameId.Login);//進入登陸界面
return;
}
PlayerPrefs.SetString(GlobalConstant.LoginVoucher, r2CLogin.LoginVoucher);//記錄登陸憑證
//登陸網關服務器
G2C_GateLogin g2CLoginGate =await ConnectGate(r2CLogin.Address, r2CLogin.Key, loginType);
if (!string.IsNullOrEmpty(g2CLoginGate.Message))
{
UIComponent.GetUiView<PopUpHintPanelComponent>().ShowOptionWindow(g2CLoginGate.Message, null, PopOptionType.Single);
UIComponent.GetUiView<LoadingIconPanelComponent>().Hide();//隱藏圈圈
_mStateManage.pKCPNetWorkState = KCPNetWorkState.Disconnectl;//狀態改爲斷開連接
return;
}
//發起連接成功事件
connectSuccesAction(g2CLoginGate);
}
catch (Exception e)
{
Log.Error(e);
throw;
}
}
當我們隨便輸入一個帳號,再點擊登陸按鈕,就觸發上面這個方法了,但是我們是連不上的。原因很簡單,這裏的驗證服地址GameVersionsConfigMgr.Ins.ServerAddress
根本不是我們配置的本地服務器地址。
聯網配置
所以我們需要重新配置,打開配置文件重新配置即可,如下圖所示:
打開這個配置文件,配置如下:
{"AssetBundleServerUrl":"http://*:8080/","Address":"127.0.0.1:10002"}
這個時候我們還需要檢查下服務器的配置,找到…/Config/StartConfig/LocalAllServer.txt文件,配置如下:
{ "_t" : "StartConfig", "_id" : NumberLong("98547768819754"), "C" : [{ "_t" : "OuterConfig", "Address" : "127.0.0.1:10002", "Address2" : "127.0.0.1:10002" }, { "_t" : "InnerConfig", "Address" : "127.0.0.1:20000" }, { "_t" : "HttpConfig", "Url" : "http://*:8080/", "AppId" : 0, "AppKey" : "", "ManagerSystemUrl" : "" }, { "_t" : "DBConfig", "ConnectionString" : "mongodb://127.0.0.1:27017", "DBName" : "GaneGather" }], "AppId" : 1, "AppType" : "AllServer", "ServerIP" : "*" }
關於ET的配置規則,屬於是基本操作了,如果閣下不太明白,我在上一篇留下了傳送門。
數據庫MongoDB
ET的默認數據是MongoDB,當然,我們完全可以修改成其他數據庫,只是MongoDB仍然是我們的首選。原因ET的作者熊貓大佬也解釋的非常清楚了,這裏不再重複贅述。
那麼我們上面的那個配置文件中也對MongoDB進行了配置,這裏要做的實際上是安裝。
MongoDB的安裝和使用,已經有另外一個大佬講過了,所以我也不講,這裏留下傳送門。
TA的博客模版很好看,二次元可愛風,所以按照TA的教程安裝即可。至於MongoDB的Compass,TA沒有安裝,我卻安裝了,畢竟可視化的軟件可以減少我們很多工作量。
編譯運行服務器端,呃,這個真的是基本操作了。運行之後,我們發現MongoDB中已經有配置文件中對應的數據了。配置文件中DBName是GaneGather,對應的數據庫是根據配置文件來創建的,如圖所示:
作者非常貼心地爲我們準備好了許多基礎數據,直接使用即可。
進入遊戲大廳
數據庫和服務器都沒有問題了,接下來登錄即可,登錄後進入遊戲大廳,如圖所示:
至此,登錄流程就走完了,實際上省略了非常多東西,真實的項目登錄起來會有更多流程:
1:由第三方平臺(如九遊,騰訊遊戲平臺等)提供的 SDK 裏的界面進行註冊或登錄,其登錄將給我們一個 token
2:請求最新的服務器列表,可通過 http 取下來.(優化:服務器列表可以分成若干文件提高用戶體驗)
3:前端向登錄服務器請求連接,然後一連接成功就會收到一個登錄服務器的隨機值(challenge)
4:前端發一個經過 dhexchange 的隨機值 (handshake_client_key) 給登錄服務器
5:登錄服務器收到 handshake_client_key 後生成併發送 handshake_server_key 給前端,此時雙方可算出密鑰 secret 了
6:前端利用之前收到的 challenge 和算出的 secret 生成併發送 hmac 和 token 信息(包含帳號密碼和遊戲服務器標識)給登錄服務器
7:登錄服務器驗證用戶信息後告訴前端是否驗證成功(200 subid 或者400 Bad Request 等)
8:開始請求連接遊戲服務器 M,連接上後前端利用 secret 和 subid 生成併發送握手校驗給 M
9:收到遊戲服務器 M 的校驗結果(成功爲200)
10:可以正常向遊戲服務器收發協議了
這些流程,也許以後會講一下,畢竟現在我不具備商業資質,所以恐怕根本跑不通。當然也不一定需要具備資質才能講,第三方開放平臺就可以申請到一些方便的微信和QQ登錄通道。
Anyway,這一篇還是儘量簡單點好了,登錄到遊戲大廳後,我們會發現幀同步不太爽。
欲知後事如何,請聽下回分解!
作者的話
如果喜歡可以點贊支持一下,謝謝鼓勵!如果有什麼疑問可以給我留言,有錯漏的地方請批評指證!
技術難題?加入開發者聯盟:566189328(QQ付費羣)提供有限技術探討,以及,心靈雞湯Orz!
當然,不需要技術探討也歡迎加入進來,在這裏劈柴、遛狗、聊天、擼貓!( ̄┰ ̄*)