腳本的基類是BaseAction,它又繼承於GameStruct,下面咱們看服務端在接收到的客戶端的數據以後如何將數據解包並調用相應腳本作出迴應的 GameSocketHost同時具有socket和http服務,咱們以它爲例安全
在構造函數它建立了SocketListener監聽數據,若是配置了http監聽地址它會同時建立HttpListener SocketListener在接收到數據後會調用socketLintener_DataReceived函數,調用過程依次爲 DoAction-> ActionFactory.Request->ActionFactory.Process 而後依次執行 baseStruct.ReadUrlElement(),baseStruct.DoAction() ,baseStruct.WriteResponse(response),服務器
public virtual void WriteResponse(BaseGameResponse response) { if (IsWebSocket) { JsonWriteResponse(response); } else { BinaryWriteResponse(response); } }
protected void BinaryWriteResponse(BaseGameResponse response) { if (!IsNotRespond) { WriteHeadProperty(); BuildPacket(); } WriteAction(response); WriteEnd(); } protected void JsonWriteResponse(BaseGameResponse response) { if (!IsNotRespond) { var message = BuildJsonPack(); response.Write(encoding.GetBytes(message)); } WriteEnd(); }
HttpListener 接收到請求以後會調用OnHttpRequest,而後調用過程同上 DoAction-> ActionFactory.Request->ActionFactory.Processsocket
baseStruct.DoAction() 會調用baseStruct.TakeAction()ide
腳本通常會實現本身的GetUrlElement,TakeAction和BuildJsonPack或BuildPacket 這三個函數的調用順序也是這樣排列的,他們的功能依次爲獲取並檢驗參數,腳本的邏輯處理,腳本處理完成返回給客戶端的數據包內容函數
鬥地主的腳本實現了本身的基類BaseAction 它的繼承關係依次爲 AuthorizeAction->AuthorizeAction->BaseStruct AuthorizeAction能夠實現腳本的執行權限區分,沒有登錄的用戶而且腳本沒有被添加進忽略權限的列表是不容許被執行的ActionFactory.SetActionIgnoreAuthorize(1012, 9001, 9203);這樣進一步增長了服務器的安全性ui
若是你想在當前腳本執行完成後作一些動做能夠在腳本實現TakeActionAffter函數,這個功能給你了調用完成A自動調用B的能力code
Scut-master\Source\Middleware\ZyGames.Framework.Game\Service\BaseStruct.cs public override bool DoAction() { bool result; try { if (!CheckAction()) { return false; } result = TakeAction(); TakeActionAffter(result); }
LoginAction是一個特殊的action 要實現 登錄動能須要實現繼承
protected override bool DoSuccess(int userId, out IUser user)
來完成登錄成功後的動做it
RegisterAction 須要實現本身的註冊功能io