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,objectdata=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.這是我第一次寫Socket,在本地測試能過,沒有碰到什么問題,可能是因為沒有什么功能所以沒有問題。
2.框架中只有接收數據的時候是在線程中,有高人建議我把發送數據也放到線程中,這個回頭我再試試。
3.流程還算是比較清晰,如果有不明白的地方,可留言。
4.建議讀者多看幾遍流程書。好理解。
就愛閱讀www.92to.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20161116/54148.html
文章列表