1. 程式人生 > >【Unity3D_常用模組】 Socket網路模組(超級詳細完整,上線專案中穩定使用著)

【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)

2.移除事件監聽:RemoveEventListener(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!!!!!!!!!!!!!!!!!!!!!!!!