ET框架學習——消息系統之二

  • AChannel 

       AChannel類繼承自ComponentWithId。內部保存了一些和網絡傳輸相關的字段(AServiceIPEndPoint等),還有兩個委託Action<AChannel, int> errorCallbackAction<MemoryStream> readCallback。這兩個委託和消息傳輸的結果相關,分別用於保存錯誤消息和正確消息的執行方法。在正確傳輸後,會執行OnRead方法,傳輸失敗是執行OnError方法。

       Achannel類的構造函數是用protected修飾的,在初始化的時候會生成組件的唯一Id(IdGenerater.GenerateId()方法),服務器類型和ChannelType

       另外,還有兩個抽象方法,Start方法和Send方法。

  • Session類

       Module.Session類是繼承自Entity, 有一個Awake事件,在組件初始化過程中會執行Awake方法。該方法會確定一個AChannel對象,同時清空Dictionary<int, Action<IResponse>> requestCallback字典(該字典猜測是用於存放相應後端消息的方法)。最後會給AChannel的兩個委託添加元素。

       Run(MemoryStream memoryStream)方法(關於MemoryStream類可以看這篇文章),參數就是網絡消息流的內容(具體是否包括參數內部,還不知道)。通過對流內容的判斷,獲取其消息碼的區間範圍,判斷是否屬於ClientHotfixMessage消息,如果是,則調用SessionCallbackComponent組件執行,這裏是將消息轉發到了Hotfix層去執行了。否則,就通過OpcodeTypeComponent組件,獲取持有消息碼的輔助類,然後配合消息流,反序列化出消息內容。接着對消息做處理,如果是rpc返回消息,否則交由MessageDispatcherComponent組件分發。如果是相應類型的消息,在requestCallback字典中查找相應的消息碼,移除對於元素後,執行消息。

       Call重載方法,向requestCallback字典中添加元素,Key是一個自增的變量,Value是一個委託,會檢測消息的RPC是否異常,然後傳遞出消息。同時調用Send方法,發送消息。具體用法,還有待學習。

      Send(byte flag, ushort opcode, object message)方法,將流指針定位到消息內容起點,將消息內容寫入到流中,將流內容包裝後,重新發送。至於都包裝了哪些內容,暫時不得而知。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章