Unity_如何設(shè)計(jì)網(wǎng)絡(luò)框架1
在Unity框架設(shè)計(jì)中與游戲服務(wù)器對(duì)接的網(wǎng)絡(luò)框架也是非常重要的一個(gè)模塊,本文給大家分享如何來(lái)基于Unity來(lái)設(shè)計(jì)一個(gè)網(wǎng)絡(luò)框架, 主要的講解以下幾個(gè)點(diǎn):

TCP半包粘包, 長(zhǎng)連接與短連接, IO阻塞
TCP 是可靠的網(wǎng)絡(luò)傳送協(xié)議,網(wǎng)絡(luò)傳輸?shù)讓用堪l(fā)送一個(gè)TCP數(shù)據(jù)包,就要等對(duì)方確認(rèn),收到確認(rèn)消息以后才能發(fā)下一個(gè)TCP數(shù)據(jù)包。當(dāng)我們?cè)趹?yīng)用層發(fā)送一個(gè)應(yīng)用層的數(shù)據(jù)包的時(shí)候,TCP網(wǎng)絡(luò)底層可能會(huì)把這個(gè)應(yīng)用層的數(shù)據(jù)包分成若干”TCP數(shù)據(jù)包”,通過網(wǎng)絡(luò)底層發(fā)出去。那么這里就會(huì)有一個(gè)問題,應(yīng)用層發(fā)的數(shù)據(jù)包有可能被拆散成幾個(gè)”TCP數(shù)據(jù)包”發(fā)出去,我們?cè)诹硗庖欢私邮盏臅r(shí)候,可能要把這些拆散的包組合起來(lái)。這個(gè)就是”半包”。底層有可能把兩個(gè)應(yīng)用層的數(shù)據(jù)包分到一個(gè)”TCP數(shù)據(jù)包”發(fā)過去,接收到后,一部分是屬于上一個(gè)應(yīng)用層的數(shù)據(jù)包,一部分屬于下一個(gè)應(yīng)用層的數(shù)據(jù)包,這個(gè)叫做”粘包”。
TCP 是面向連接的,服務(wù)端與客戶端通過TCP 連接來(lái)傳送數(shù)據(jù),如果連接一直在,發(fā)送完數(shù)據(jù)后,不關(guān)閉連接,下一次發(fā)數(shù)據(jù)可以直接發(fā)送,我們叫做長(zhǎng)連接。如果發(fā)送數(shù)據(jù)先建立連接,數(shù)據(jù)發(fā)送完畢后,馬上關(guān)閉連接,下次要發(fā)送數(shù)據(jù)重新建立連接,這種叫做”短連接”。長(zhǎng)連接一直存在,優(yōu)點(diǎn)就是客戶端與服務(wù)端隨時(shí)可以相互通訊,但是一直占用連接資源。短連接是不占用連接資源,但是只有客戶端能像服務(wù)端發(fā)送數(shù)據(jù),服務(wù)端在斷開連接后無(wú)法主動(dòng)通知客戶端。
IO阻塞指的是我們的CPU處理數(shù)據(jù)的速度,遠(yuǎn)遠(yuǎn)大于網(wǎng)絡(luò)的傳送速度。當(dāng)我們要發(fā)送數(shù)據(jù)的時(shí)候,CPU調(diào)用IO的接口,把數(shù)據(jù)從內(nèi)存拷貝到網(wǎng)絡(luò)底層,等待底層把數(shù)據(jù)傳送過去后,CPU調(diào)用的IO函數(shù)返回,而這個(gè)過程,CPU在等待網(wǎng)絡(luò)把數(shù)據(jù)發(fā)出去,線程掛起了,這個(gè)我們叫做IO阻塞。
Tcp Socket與UDP Socket 的技術(shù)方案
了解完網(wǎng)絡(luò)的一些基本概念以后,接下來(lái)看下使用TCP/UDP Socket用哪些技術(shù)方案。Unity其實(shí)是作為網(wǎng)絡(luò)的客戶端,而客戶端只要去連接服務(wù)端與服務(wù)器通訊就可以了,不用像服戶端同時(shí)處理N個(gè)客戶端的數(shù)據(jù)傳送。所以客戶端Socket非常的簡(jiǎn)單。Unity客戶端的Socket我們用哪個(gè)插件呢?其實(shí)這種完全不需要用什么插件,直接使用OS為我們提供的Socket的相關(guān)API就可以了。
TCP Socket 面向連接的,使用流程如下:
1: 客戶端Connect服務(wù)端,建立Socket連接;
2: 調(diào)用Socket的Send函數(shù)發(fā)送數(shù)據(jù);
3: 調(diào)用Sokcet Recv函數(shù)從Socket上讀取數(shù)據(jù);
4: 關(guān)閉Socket 的連接;
UDP Socket的使用, UDP Socket不是面向連接的,只是調(diào)用底層的網(wǎng)絡(luò)協(xié)議,直接把數(shù)據(jù)包發(fā)往特定地址+端口。所以直接是SendTo(網(wǎng)絡(luò)地址+端口), RecvFrom(網(wǎng)絡(luò)地址+端口)
TCP/UDP Socket已經(jīng)足夠簡(jiǎn)單,Unity開發(fā)者在選取技術(shù)的時(shí)候直接使用即可。
Unity的序列化與反序列化技術(shù)方案
網(wǎng)絡(luò)發(fā)送的都是數(shù)據(jù)字節(jié)流,Unity與服務(wù)端通訊要把要發(fā)送的數(shù)據(jù)對(duì)象變成二進(jìn)制字節(jié)流,然后通過網(wǎng)絡(luò)傳送出去,收到字節(jié)流以后,又要重建回?cái)?shù)據(jù)對(duì)象,完成數(shù)據(jù)發(fā)送。數(shù)據(jù)對(duì)象變成二進(jìn)制字節(jié)流這個(gè)過程叫序列化,把二進(jìn)制字節(jié)流轉(zhuǎn)回?cái)?shù)據(jù)對(duì)象叫反序列化。
序列化/反序列化目前主要有兩個(gè)打的方向:一個(gè)是二進(jìn)制序列化,一個(gè)是文本序列化;
二進(jìn)制序列化/反序列化:基于二進(jìn)制的bit,通過用戶商量的協(xié)議來(lái)把數(shù)據(jù)對(duì)象變成二進(jìn)制bit數(shù)據(jù)流,反序列化的時(shí)候根據(jù)用戶協(xié)議,來(lái)把bit數(shù)據(jù)流變成數(shù)據(jù)對(duì)象。
文本序列化: 將數(shù)據(jù)變成人眼可讀的文本數(shù)據(jù)。當(dāng)收到序列化好的文本數(shù)據(jù)的時(shí)候,根據(jù)文本數(shù)據(jù)的規(guī)則來(lái)解析出里面的數(shù)據(jù)重建數(shù)據(jù)對(duì)象。

二進(jìn)制序列化/反序列化解決方案: protobuf;
還有三小節(jié)發(fā)布在下一篇