protobuf在遊戲伺服器開發中的應用
protobuf 是google開源的一個序列化框架,是基於二進位的協議。
優點:
1:序列化和反序列化效率比xml,json要高
2:序列化後的體積要比json和xml都要小
3:支持跨平台多語言
開發遊戲中如何使用:
下載地址:
https://download.csdn.net/download/zisuting/10316263
客戶端與伺服器交互的協議定義成.proto文件,通過protoc.exe編譯後生成對應的.java文件和.cs文件。
下載好後解壓目錄如下
如何寫proto文件
如上圖我們定義了一個登陸請求協議
用到的關鍵字有 package, option, message, optional, int32, int64, string
支持的關鍵字類型如下:
如何將寫好的proto生成對應的java代碼:
上圖是文件目錄,protos存放寫好的.proto文件。Tools是解壓好的protobuf編譯文件,build-java.bat是批處理的編譯腳本內容如下:
運行這段批處理腳本會將protos目錄下及其子目錄的.proto文件生成對應的java文件到out目錄下
在遊戲伺服器開發中,我們如何定義協議:
第一部分:我們在一個包的頭部定義一個int型或者short類型的(取決於協議的數據量大小)包頭用於表示包體的大小;
第二部分:協議號int類型或者short類型(取決於協議數量的多少)的協議號用於判斷該包屬於哪條協議是登陸協議還是抽獎協議等用於解包的判斷;
第三部分:對應的protobuf里定義的數據。
Java的netty伺服器對應的解碼器部分:
修改netty部分:
將socket管道綁定對應的解碼器
總結:
遊戲伺服器開發部分對於協議部分的講解基本上就這些內容,但難免會有紕漏,望指正。
推薦閱讀:
※通俗地講,Netty 能做什麼?
※追蹤 Netty 異常佔用堆外內存的經驗分享
※為什麼nio效率會比bio高?
※Netty的Reactor線程組中的每個Reactor線程處理網路I/O為什麼一定要串列化,並行化不是更能提高系統吞吐量嗎?
※netty的編/解碼器有什麼分類背景(netty-in-action中沒有對此部分詳細陳述)?