ToLua学习笔记,通信(三)

protobuf是谷歌创造的最给力的一种协议格式,它的传输效率高,使用方便。在lua中使用protobuf的基本步骤如下:

1:编写.proto协议文件

2:通过批处理命令导出不同语言对应的消息包(类文件)

protobuf可以导出c++ java c# 等等很多种语言的消息包,但是不包括Lua语言,为此我们需要一个辅助工具protoc-gen-lua,此工具的目的是从.proto文件导出.lua文件

推荐到蒙哥的Git上下载

另外一提protobuf发展到现在,语法已经出现了syntax2,syntax3。protoc-gen-lua只支持syntax2,只支持到protobuf2.5以前

这里使用protobuf2.4.1,点击下载

参考此篇文章:http://blog.csdn.net/huutu/article/details/49672225,编译生成指定的文件,Debug模式导出就可以,最终产生protoc.exe和需要依赖的.lib和.dll文件。

在之后的c++服务端里也会用到他们。

进入protoc-gen-lua\protobuf,下图的文件就是用来解析Lua文件的工具:

ToLua学习笔记,通信(三)_第1张图片

此库其实已经加入到了ToLua框架中:

ToLua学习笔记,通信(三)_第2张图片

他们的作用就是把消息包(表)转化为字符串,或者从字符串中解析出消息包(表)

进入protoc-gen-lua-master\plugin,创建build.bat,内容如下:

ToLua学习笔记,通信(三)_第3张图片

它的作用是调用protoc-gen-lua文件。

在ToLua项目中的Packager.cs文件中添加如下功能:

ToLua学习笔记,通信(三)_第4张图片

上图的protoc指定了最上边导出的protoc.exe文件位置,protoc_gen_dir指定了刚创建的build.bat文件位置。

--cpp_out --lua_out表示要导出c++文件和.lua文件,其中c++文件会以xxx.pb.h和xxx.pb.cc的形式出现,lua文件以xxx_pb.lua的形式出现。

./表示生成到当前目录,这个当前目录是info.WorkingDirectory指定的目录。

此时可以测试导出功能了

从protoc-gen-lua-master\example拷贝测试文件到unity中

ToLua学习笔记,通信(三)_第5张图片

ToLua学习笔记,通信(三)_第6张图片

选择PbLua2目录,点击导出菜单:

ToLua学习笔记,通信(三)_第7张图片

生成如下文件:

ToLua学习笔记,通信(三)_第8张图片

打开common_pb.lua和person_pb.lua内容如下:



这里protobuf.protobuf的目的是为了引用ToLua框架中的工具库,因为在Build Windows Resource命令后,目录如下列关系:

ToLua学习笔记,通信(三)_第9张图片

module('PbLua2.person_pb') 这句是创建了一个叫person_pb的表,外部使用时需要require"PbLua2.person_pb",如下所示:

ToLua学习笔记,通信(三)_第10张图片

如果想把PbLua2定义为自己想要的目录,需要找到如下文件:

ToLua学习笔记,通信(三)_第11张图片

直接用vs打开,搜索PbLua2:

ToLua学习笔记,通信(三)_第12张图片

此处是蒙哥修改过的代码,我们可以改为自己需要的内容。如果不是蒙哥的工程,可能只会生成不带前缀的模块名和引用名。

这种办法生成的.lua文件必须要放在同一个目录中,比较死板,这是为了协议文件在互相引用时能正确找到依赖文件的位置。

如果想要做到每个协议都放到自己单独的目录中,势必存在跨目录引用,也就是require的内容和module的内容需要根据外界传输的目录动态设置,这个功能以后再说。

现在可以测试一下了:

ToLua学习笔记,通信(三)_第13张图片

通过SerializeToString(),person_pb的内容可以转化为string,由ByteBuffer读取,再发送出去。

通过ParseFromString(data),可以从string中解析出person_pb表

上边内容为:当连接成功后,会创建新的消息,协议号为1001。最后来看下服务端的结果:


下面来看下服务端使用protobuf的情况

选择工程》属性》C/C++》常规》附加包含目录》选择protobuf-2.4.1\src如下图:

ToLua学习笔记,通信(三)_第14张图片

选择工程》属性》C/C++》预处理器》预处理定义》增加以下内容:

ToLua学习笔记,通信(三)_第15张图片

选择工程》链接器》常规》附加库目录》选择protobuf-2.4.1\vsprojects\Debug所在完整目录,上边已经编译生成的文件终于派上用场了,这些库是帮助c++来解析处理协议类的。

把unity内生成的协议文件添加到工程中:

ToLua学习笔记,通信(三)_第16张图片

以下是测试代码:

ToLua学习笔记,通信(三)_第17张图片

ToLua学习笔记,通信(三)_第18张图片

如上图,需要包含person.pb.h,由于我的协议文件使用了简单协议:

ToLua学习笔记,通信(三)_第19张图片

所以需要加载静态库libprotobuf-lite.lib,如果需要反射功能,可以加载libprotobuf.lib。

点击此处下载服务端,此服务端未作拆包粘包,只能测试单个消息。


你可能感兴趣的:(Unity开发工具)