Unity_如何設(shè)計(jì)網(wǎng)絡(luò)框架2
承接上篇
TCP的封包與拆包
上面講解了,應(yīng)用層的數(shù)據(jù)包有可能被拆分成若干”TCP數(shù)據(jù)包”,還有可能兩個(gè)應(yīng)用層的數(shù)據(jù)包連在一起在一個(gè)”TCP數(shù)據(jù)包”中。為了收數(shù)據(jù)的時(shí)候能完整正確的收到應(yīng)用層的數(shù)據(jù)包,我們必須要把兩個(gè)應(yīng)用層的數(shù)據(jù)報(bào)之間做好分隔標(biāo)記,當(dāng)我們收到數(shù)據(jù)以后就可以根據(jù)分隔標(biāo)記來(lái)決定哪些數(shù)據(jù)是哪個(gè)包的。目前有兩種做法:
(1) 大小+數(shù)據(jù)內(nèi)容+校驗(yàn)碼模式;[size][數(shù)據(jù)body][校驗(yàn)], 游戲開(kāi)發(fā)中經(jīng)常會(huì)使用這種方式來(lái)做封包, 收數(shù)據(jù)的時(shí)候,根據(jù)大小來(lái)將數(shù)據(jù)包完整的組合出來(lái)。WebSocket也是采用的這種方式。
(2) 特定的分割符模式: 123456\r\n67890, Html采用特定的分割符號(hào)來(lái)拆分?jǐn)?shù)據(jù)內(nèi)容。
基于http的短連接技術(shù)方案
短連接,前面?zhèn)€講過(guò)的,用完就斷開(kāi)連接,下次要用的時(shí)候再重新的連接。短連接是使用TCP Socket策略,而這種策略最常用的就是http(基于TCP Socket+http超文本傳輸協(xié)議)。
Unity網(wǎng)絡(luò)框架中也要使用http,主要是和服務(wù)器對(duì)接基于http通訊以及資源服務(wù)器的下載等需求。Unity作為客戶端,要使用http,都已經(jīng)封裝好了UnityWebRequest,同時(shí)UnityWebRequest是多線程模式,可以同時(shí)并發(fā)N個(gè)請(qǐng)求。
Unity?網(wǎng)絡(luò)框架設(shè)計(jì)與實(shí)現(xiàn)原理
鋪墊了這么多,我們直接來(lái)上Unity網(wǎng)絡(luò)框架的架構(gòu)設(shè)計(jì)結(jié)構(gòu)圖,供大家參考。

這里接收數(shù)據(jù)的時(shí)候,采用多線程來(lái)做,收到數(shù)據(jù)后,進(jìn)行拆包與反序列化,得到數(shù)據(jù)對(duì)象后,放事件隊(duì)列,游戲主線程從事件隊(duì)列里面獲取網(wǎng)絡(luò)事件,然后進(jìn)行處理。發(fā)送數(shù)據(jù)出去的時(shí)候,我們?cè)谟螒蛑骶€程調(diào)用異步的網(wǎng)絡(luò)Send函數(shù),避免IO阻塞。注意好這些點(diǎn),就可以設(shè)計(jì)出一個(gè)很好的網(wǎng)絡(luò)框架。