千锋教育-做有情怀、有良心、有品质的职业教育机构
前言
一般我们说到网络框架,主要是指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的网络框架简介,希望对你有所帮助
相关推荐