【Unity3D_常用模組】 Socket網路模組(超級詳細完整,上線專案中穩定使用著)
Socket網路連線模組
主要分為四部分:
一、套接字管理器(SocketManager.cs)
1)、連線
2)、斷開
3)、接收(執行緒)
4)、傳送(攜程)
1.傳送訊息基本方法
2.二進位制方式傳送
3.protobuf方式傳送
二、訊息中心:(MessageCenter.cs)
1)、遊戲邏輯事件
a.事件快取:
1.事件型別對應的資料快取佇列:_gameLogicDataQueue
2.事件型別對應的執行函式:_gameLogic_EventList
b.相關函式:
1.新增事件監聽:AddEventListener(eGameLogicEventType _eventType, Callback_GameLogic_Handle _callback)
3.推送、觸發事件:PostEvent(eGameLogicEventType _eventType, object data = null)
2)、網路資料事件(執行緒)
a.事件快取:
1.事件型別對應的資料快取佇列:_netMessageDataQueue
2.事件型別對應的執行函式:_netMessage_EventList
b.相關函式:
1.新增事件監聽:addObsever(eProtocalType _protocalType, Callback_NetMessage_Handle _callback)
2.移除事件監聽:removeObserver(eProtocalType _protocalType, Callback_NetMessage_Handle _callback)
3)、執行流程
a.建立單例:MessageCenter.Instance
b.迴圈檢測:
三、資料封裝:
1)、網路資料緩衝器(DataBuff.cs)自動Size
a.引數定義:
2.新增資料到快取中
3.從快取中取出一條完整資料
2)、二進位制位元組流(ByteStreamBuff.cs)
在和伺服器做資料互動的時候,最終要把資料轉化成byte[],傳給伺服器。
如:
要將這些資料傳給伺服器,怎麼變成byte[]陣列呢?這裡就要做一個數據封裝。所有資料都是可以變成byte或byte[]來表示,要做的其實就是把這些資料拼成一個byte[]。
如:
寫入:
讀取:
這裡已經對SendMsg做的過載,故直接傳入,ByteStreamBuff或者,protobuf資料即可,SocketManager在傳送前會轉換為Byte[],再發送出去。
很多對資料的二進位制封裝的方法都是用byte[] 來做快取媒介,所以在沒事new 的時候,都要先給這個資料封裝器,定一個大小,為了省事,所以這裡用Stream作用快取媒介。還有就是在封裝器中有一個flip()函式,這裡要再說一下,就是系統的大小端問題,如果前端是大端系統,後端是小端系統在資料互動的時候就會出問題了。細節就不解釋了,百度(系統大小端)就可以了,不難理解的。3)、谷歌ProtoBuffer序列化
a.現在手遊這個用的很火。方便快捷,壓縮效率也要。主要就是兩個函式,序列化,反序列化。這個兩方法封閉在SocketManager.cs中。
b.序列化
c.反序列化
四、簡單流程圖
五、總結
1.框架中只有接收資料的時候是線上程中,有高人建議我把傳送資料也放到執行緒中,這個回頭我再試試。
2.流程還算是比較清晰,如果有不明白的地方,可留言。或(QQ:8321884)
3.建議讀者多看幾遍流程書。好理解。
希望轉載的朋友連線一下本文URL!!!!!!!!!!!!!!!!!!!!!!!!