在線網絡遊戲,是最重要的遊戲形式,
通過互聯網,玩家可以一起聯網對戰,能帶來很多的樂趣。
H5微信小遊戲,抖音小遊戲怎麼樣做聯網對戰和傳統的有什麼不一樣的?
首先我們來看傳統的聯網,我們直接用TCP socket, 而H5的標準裏面,我們用的是websocket,今天我們來說一說websocket 到底是什麼。
TCP socket 的代價:
TCP是可靠的傳輸協議,這個大家都知道,怎麼實現可靠的呢?
就是發送端發送一個數據包,接收端迴應收到後,再發送下一個,這個是由操作系統 底層來實現的, 這種處理邏輯,會帶來一個問題,驗證需要代價,底層想等多一點數據,一起發過去。這樣會導致我們app 連續發送2個數據包的時候,這兩個數據包,底層會有可能一起發出去,接收端會一起收到這2個數據包。
那麼這個時候問題來了,對於app而言希望一個一個數據包處理,可是服務端收到了2個黏在一起的數據包,服務器程序也希望收到的是一個一個數據包,
但是實際卻收到2個數據包,所以我們一般的做法,是app自己給這個數據包打上標識協議,根據協議方便把2個在一起的數據包分開。
App 做數據包的標識兩種方式:
(1) 數據大小size + 數據內容body + 校驗;
(2) 數據內容body + 特殊的標識符號(如\r\n);
當我們收到一個2個數據包在一起的時候,解析數據包裏面的內容,
先讀取第一個數據包的大小,讀到數據後,根據大小可以定位下一個數據包的位置,依此類推。你使用TCP Socket ,每個裏面都會有類似的協議;
H5 的websocket:
其實每次些拆包封包也挺蠻煩的,所以H5提出了一個標準解決方案,這個方法就是websocket。
(1) websocket 底層基於TCP Socket
(2) websocket 實現了4個協議(相當於自定義拆包,封包協議):
連接握手協議;
關閉協議;
發送數據協議: 包頭 + 數據內容;
接收數據協議: 包頭 + 數據類容;
這樣得到得結果就是
客戶端使用websocket 與服務器的websocket來相連接, 客戶端使用 ws 來發送數據,服務器,使用websocket協議來接收,接收到的就是用戶完整的數據包。自己不用實現拆包,發送數據的時候也不要使用封包了,大大的減少了用戶編寫網絡代碼的難度。
Websocket = (TCP socket + 拆包,封包的一個協議)