千鋒教育-做有情懷、有良心、有品質的職業教育機構
前言
一般我們說到網絡框架,主要是指Socket網絡框架,如果是Http的話,我們沒有必要單獨介紹了,簡單用可以直接使用WWW或者UnityWebRequest,如果稍微復雜的使用,可以使用RestSharp庫。所以我們本章主要討論的是xlua-framework框架是如何實現socket網絡框架的。
雖然lua自帶的有socket庫,但是luasocket其實更適合寫命令行工具。游戲里直接用為Lua寫的網絡庫其實不多,大多數是從C++、C#封裝一個自己的庫,然后在lua中調用。當然也有luasocket實現的服務端網絡框架,skynet主要是為服務器設計的,不太容易用到客戶端里,畢竟主要是服務器監聽+多線程。所以xlua-framework也是這么做的,在C#端實現了一套Socket的鏈接,然后lua端進行監聽和調用。
網絡管理器
其實C#端的網絡實現,大多數框架都大同小異,無非就是使用C#系統自帶的Socket套接字,然后封裝連接,封裝收發消息等,我們就不再詳細解釋了,大致的代碼結構如下所示:
DoReceive方法中,我們需要處理下數據的接受,ReceivePkgHandle函數,綁定的是Lua中的數據接受function
lua端網絡連接器
lua端的連接器,實際上只是對C#端管理器的一個包裝,基本結構如下所示
網絡消息發送
網絡消息的發送,我們來定義多個xxxxRequest類,專門用于不同的場景發送網絡消息,比如:LoginRequest,登錄時用的消息發送,GameRequest,游戲對戰中用的消息發送,示例代碼入下
當用戶點擊登錄按鈕的時候,我們調用ReqLogin函數即可。
網絡消息接受
網絡消息的接受,我們采用分發的機制來處理,C#端傳遞過來的網絡消息,我們統一在HallConnector.OnReceive中接受,不同的消息有不同的消息id,我們根據不同的消息id,把消息分發到各個不同的消息接收器中,比如:LoginHandler:登錄消息接收器,GameHandler:游戲對戰消息接收器。
如何綁定消息
如何分發消息
lua-protobuf
首先注意,
原框架 xlua-framework 中,使用的protobuf-gen-lua,
而 xlua-framework-unity2018 中升級為了lua-protobuf,
兩者有什么區別呢?
protoc-gen-lua:會給每一個.proto文件生成一個巨大的.lua協議描述文件,使用起來也需要找到對應的lua協議表名,先new,然后再序列化為字符串local msg = login:SerializeToString()。用起來沒有pbc簡潔,和pbc一樣都不再維護了,且都不支持最新的lua和protobuf版本,
lua-protobuf:這個是我推薦使用,并且目前也在使用的版本,使用方法和pbc基本一樣,生成pb二進制描述文件,然后引入后就直接使用,解析原理雖然和pbc不一樣,但是使用起來完全一樣,主要是一致在維護更新,支持最新的lua和protobuf,并且效率也很高,數據解析也是多層的普通表,pbc是代理表,惰性解析。目前xlua作者也推薦使用lua-protobuf,pbc也支持,
可以參考我的這篇文章:xlua接入protobuf
生成pb文件
其實我們雙擊make_proto.bat就可以導出.pb文件了,但是導出目錄就在這個文件夾,不在工程內,所我們在unity編輯器又寫了一個執行并拷貝的工具,我們直接點擊proto gen lua 按鈕就可以了,.pb文件會自動拷貝到LuaScript/Net/Proto目錄,然后游戲可以直接運行,自動加載的就是最新的pb文件
加載pb文件
解析pb文件
注意,我們再OnReceive的時候,已經按照msg_id解析過結構體了,所以我們再Handler分發消息處理器中,實際上是拿到的直接就是可以使用的table數據了
結束
好了,以上就是我們的xluaframework的網絡框架簡介,希望對你有所幫助
相關推薦