不了解ET的,點(diǎn)擊?https://github.com/egametang/ET
一:消息分類(lèi)

消息按照因果關(guān)系分類(lèi),可以分為Request和Response,當(dāng)然也有直接繼承至Message的,表示我這個(gè)消息發(fā)出去后我就不care了。Request和Response是成對(duì)的,我發(fā)了一個(gè)Request,你必須回我一個(gè)對(duì)應(yīng)的Response消息。
消息還可以按照類(lèi)型分類(lèi),基本分為兩大類(lèi),一般消息和Actor消息。Actor消息可以認(rèn)為是戰(zhàn)斗相關(guān)消息,戰(zhàn)斗unit和玩家client之間發(fā)送的都是Actor消息,比如幀同步消息(AFrameMessage)就是一種ActorMessage,其他的都可以認(rèn)為是一般消息,比如登陸,創(chuàng)角等。
Actor相關(guān)的消息在服務(wù)器間相互轉(zhuǎn)發(fā)的時(shí)候,會(huì)被包裝一下。想象一下,一個(gè)Client與GateServer之間的通信,消息里面是不用帶玩家角色I(xiàn)d的,我們之間的Session對(duì)象就表明了我的身份。但是GateServe把這個(gè)消息轉(zhuǎn)發(fā)給MapServer的時(shí)候,消息就得包裝一下,帶上UnitId的信息,這樣MapServer收到這個(gè)消息后才知道是那個(gè)玩家發(fā)過(guò)來(lái)的。包裝actor消息包括ActorRequest和ActorRPCRequest,AActorMessage不需要回復(fù),就包裝在ActorRequest中,而AActorRequest需要回復(fù),包裝在ActorRPCRequest中。所以ActorRequest和ActorRPCRequest包括他們的回復(fù)消息只在服務(wù)器之間傳送Actor消息的時(shí)候用。
其實(shí)按照消息的路徑,還可以把消息分為內(nèi)部消息和外部消息,內(nèi)部就是服務(wù)器內(nèi)部之間發(fā)送的,外部則是負(fù)責(zé)服務(wù)器和客戶(hù)端通信的。在ET中,有InnerMessage和OuterMessage兩個(gè)文件,里面定義的消息就分別是內(nèi)部和外部消息。只有Realm服務(wù)器和Gate服務(wù)器有NetOuterComponent,可以與客戶(hù)端通信,其他服務(wù)器都只有NetInnerComponent,Realm服務(wù)器作為初始登陸服務(wù)器,負(fù)責(zé)分配Gate服務(wù)器給玩家,之后玩家都直接與Gate服務(wù)器通信,之后其他服務(wù)器都通過(guò)Gate服務(wù)器與玩家通信。
二:消息流程

這里面弄清了幾個(gè)原則,基本就清楚了消息的處理原則:
1:Gate服務(wù)器既需要與客戶(hù)端通信,也需要與其他服務(wù)器通信。所有同時(shí)擁有NetOuterComponent和NetInnerComponent。
2:Map服務(wù)器不直接與客戶(hù)端通信,需要通過(guò)Gate服務(wù)器轉(zhuǎn)發(fā),所以只有NetInnerComponent。
3:客戶(hù)端發(fā)送給Gate服務(wù)器的消息,都是通過(guò)NetOuterComponent走的,所以Actor消息都是AActorMessage或者AActorRequest類(lèi)型(因?yàn)镚ate服務(wù)器上接收消息的Session就表明了客戶(hù)端的身份),而這些Actor消息是需要轉(zhuǎn)發(fā)給Map服務(wù)器的,Gate服務(wù)器和每個(gè)Map服務(wù)器之間都只有一個(gè)Session(屬于NetInnerComponent),所有Actor消息都通過(guò)這個(gè)Session發(fā)送,所以Actor消息在這里需要包裝成ActorRequest或者ActorRpcRequest消息,帶actorId,Map服務(wù)器接收到這個(gè)消息后通過(guò)actorId才知道交給哪個(gè)Actor處理。
4:Map服務(wù)器發(fā)送給Gate服務(wù)器的ActorRequest或者ActorRpcRequest消息,Gate服務(wù)器只需要把包裝里面的AMessage發(fā)送給對(duì)應(yīng)的客戶(hù)端即可。