本文作者是由简书ID:「一个过客」开发者友情提供,原文地址在此:http://www.jianshu.com/p/41eb7ec73df9
最近使用skynet作为服务器,开发前端使用Cocos2d-x Lua。由于前后端都是用Lua编写,在搭建双方的通信环节有一个步骤就是选择通信的协议,通用选择是protobuf + socket的方式,但由于protobuf对Lua的支持问题,我们选择了pbc这个proto解析库。
本文解决的问题
前端Cocos2d-x Lua引擎,如何使用luasocket + protobuf和skynet进行通信?
前端使用:luasocket pbc lpack
后端使用:socket pbc string.pack string.unpack
skynet在数据发送时使用的是string.pack()string.unpack()进行打包解包然后这两个函数是Lua5.3的。前端的Cocos是Lua5.1没有这个API,因此才有了lpack这个库。
pbc
github.com/cloudwu/pbc.git
lpack
github.com/LuaDist/lpack.git
skynet
github.com/cloudwu/skynet.git
定好协议并可通信的skynet服务器和cocos2d-x客户端
github.com/gameloses/cocos2dx_lua_skynet_client.git
git clone
github.com/gameloses/skynet_pbc.git
Github
github.com/gameloses/cocos2dx_lua_skynet_client.git
接下来就是进行一个前后端的对接逻辑。
Cocos2d-x集成pbc和lpack
这是一个已经集成好的Cocos2d-x的例子,开源代码在github
下面开始详细的集成教程
集成pbc
编译pbc
pbc下的src拷贝到编译目录。假设你得建一个pbc目录然后把src下的代码copy到pbc下进行编译。发现pbc的.c在VS中不能按C代码编译,而应该按C ++编译,在所有.c的属性页中的“C / C ++ =>高级”中,设置“编译为C ++代码”后编译通过。因为pbc全是c代码索引得重新设置。添加luabindings代码
将pbc目录下binding / lua / pbc-lua.c文件复制到项目中,添加头文件:pbc-lua.h代码如下:
编写桥接代码添加到工程:lua_cocos2dx_pbc_manual.h,lua_cocos2dx_pbc_manual.cpp
AppDelegate中添加代码
编译一下就ok。Android和Mac平台比较简单这边先不说。
将binding / lua下的protobuf.lua parser.lua拷贝到Lua代码目录下。
测试
添加协议
pbhead.proto
协议生成
解析协议
编码解码
集成lpack
下载lpack。添加lpack.c到项目
添加一个lpack.h
在App Applegate中添加代码
进行测试
lpack是注册在string类里面的。string.pack string.unpack pack(f,...)unpack(s,f,[init])注意unpack多返回了一个长度信息(坑)
前后端消息格式定义
协议缓冲区数据包结构如下:
开头2字节存放一个短数据,表示整个数据包的长度即时:
数据包总长度= 2字节+ 2字节+PBMsgHead字节数+PBMsgBody字节数+1字节
随后的2字节存放一个短数据,表示PBMsgHead数据的长度。
PBMsgBody数据长度=数据包总长度 - 2 - 2 - 1 - PBMsgHead数据长度。
需要注意的是PBMsgBody有可能为空,即没有这个数据。因为错误码放在PBMsgHead里面,当逻辑出错时候,只有错误码,没有PBMsgBody。
luasocket进行数据收发
至次客户端的工作算是完成了,还不清楚的用户可以到github查看。
skynet使用pbc
skynet使用pbc解析protobuf,通过socket和客户端通信。
前提是搭建编译skynet的环境。
下载pbc编译make得到protobuf.so
将pbc / binding / lua53 / protobuf.lua复制到根目录的lualib目录
protobuf.so文件复制到根目录的luaclib目录.pbc就算是集成好了。
具体的步骤看下面。
服务器编译步骤
克隆完整的代码代码中引用了skynet和pbc
git clone
github.com/gameloses/skynet_pbc.git
cd skynet_pbc
git子模块init
git子模块更新
cd
skynet
git子模块init git子模块更新
编译skynet
cd skynet
使用linux
编译pbc
cd ../3rd/pbc
make
cd绑定
cd lua53
make
如果提示找不到lua.h则需要安装一下lua5.3。make && make install
(或者修改一下Makefile文件,设置lua.h的路径)
将protobuf.lua复制到根目录的lualib目录
protobuf.so文件复制到根目录的luaclib目录
编译原文件
回到根目录
make
如果没有安装protobuf的话会报错,因为需使用protoc
yum install protobuf-devel.x86_64
yum install protobuf.x86_64
运行
run.sh
使用Cocos2d-x测试一下连接。
clinet的地址
github.com/gameloses/cocos2dx_lua_skynet_client.git
当然,要完成以上所有动作的前提,首先你必须要做的就是戳阅读原文到官网了解并下载Cocos2d-x !
戳原文,更有料!