文章出處

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

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()