如何正确实现Cocos2d-x和Skynet通信

本文作者是由简书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

  1. 编译pbc 
    pbc下的src拷贝到编译目录。假设你得建一个pbc目录然后把src下的代码copy到pbc下进行编译。发现pbc的.c在VS中不能按C代码编译,而应该按C ++编译,在所有.c的属性页中的“C / C ++ =>高级”中,设置“编译为C ++代码”后编译通过。因为pbc全是c代码索引得重新设置。

  2. 添加luabindings代码
    将pbc目录下binding / lua / pbc-lua.c文件复制到项目中,添加头文件:pbc-lua.h

    代码如下:

aba7f431f6cf64942f691b228d08e9f0.jpeg

编写桥接代码添加到工程:lua_cocos2dx_pbc_manual.h,lua_cocos2dx_pbc_manual.cpp

c7b25253d87ac54057642befe1f1fa87.png

e99b3388bd424c71d1faeb740f95ad20.jpeg

AppDelegate中添加代码

5c184b62636ff98746cdbb112e61ee5c.png

编译一下就ok。Android和Mac平台比较简单这边先不说。

将binding / lua下的protobuf.lua parser.lua拷贝到Lua代码目录下。

测试
添加协议
pbhead.proto

1b9e08d0c25fa8ccd270651f59f8ba71.png

协议生成

ccc1b868c490b380cd2c3b38d08a0629.png

解析协议

9256c553e61f496c8fd0564a13a19839.png

编码解码

5774a4343a3401f5bcf51e422840886d.png

集成lpack

  1. 下载lpack。添加lpack.c到项目

  2. 添加一个lpack.h

07179f1f1b4ed54b2aa8bdc2e7cb614c.png

在App Applegate中添加代码

fb36fc977f4c8c832d5a51d0c8ce4f2c.png

进行测试
lpack是注册在string类里面的。string.pack string.unpack pack(f,...)unpack(s,f,[init])注意unpack多返回了一个长度信息(坑)

前后端消息格式定义

协议缓冲区数据包结构如下:

da828a83bd1e1c39eacfb82820b2458f.png

开头2字节存放一个短数据,表示整个数据包的长度即时:

数据包总长度= 2字节+ 2字节+PBMsgHead字节数+PBMsgBody字节数+1字节

随后的2字节存放一个短数据,表示PBMsgHead数据的长度。

PBMsgBody数据长度=数据包总长度 - 2 - 2 - 1 - PBMsgHead数据长度。

需要注意的是PBMsgBody有可能为空,即没有这个数据。因为错误码放在PBMsgHead里面,当逻辑出错时候,只有错误码,没有PBMsgBody。

luasocket进行数据收发

9cf75137b49479d746011da659dfd60f.jpeg

aa4a42e06c9a7256f1e5acdb29b104c5.jpeg

fd6f7541f08f91536f1cb52503b44286.jpeg

至次客户端的工作算是完成了,还不清楚的用户可以到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 !

96dfcaa735cb3063e53730c601047d38.gif

戳原文,更有料!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值