客户端准备-协议集成

基于Quick-Cocos2dx-Community3.6.2(编译运行我就不多说,有需要可以网上找下)
https://github.com/iTyran/Quick-Cocos2dx-Community
协议采用pbc:
https://github.com/cloudwu/pbc
简单介绍一下,这是云风开源的一套protobuf-lua库,用于数据的打包解包,相比protoc-gen-lua,个人觉得要好一些,常用的嵌套那些都支持,而另外一个还要修改代码支持且性能要差些,所以建议使用这个,云大同时也开发一个叫sproto的协议库,轻量,性能也好,只是相比protobuf没那么热门,这次还是选择主流,后面后机会,再写下。
由于这个git下面东西比较多,我把关键的我们客户端要用到的给拿出来了,这样方便使用,可以去这里取(有对lpeg这个正则库有依赖):


更新:
sproto:
https://github.com/cloudwu/sproto
也是需要lpeg依赖的,这个是我自己整理的,包含pbc和sproto,已经添加了lsproto.h头文件
http://pan.baidu.com/s/1kUIJ3r5


集成很简单,就两步(我已经为你准备好了最新的库,至少我认为是足够了):
1.把pbc和lpeg拷贝到(quick引擎目录/quick/lib/quick-src/lua_extensions目录下)
需要sproto则把sproto和lpeg保留并拷贝。
分平台做一些引入操作:
Android:
向Android.mk修改为以下内容,主要添加pbc、sproto和lpeg的编译文件。(避免新手问题我整个贴出来了,特别注意\号后面的内容不要带任何字符,不然会导致Android编译不过,对于仅仅想用一种协议,可以自行选择):

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := lua_extensions_static
LOCAL_MODULE_FILENAME := libluaextensions

LOCAL_SRC_FILES := $(LOCAL_PATH)/lua_extensions_more.c \
                    $(LOCAL_PATH)/zlib/lua_zlib.c \
                    $(LOCAL_PATH)/filesystem/lfs.c \
                    $(LOCAL_PATH)/lpack/lpack.c \
                    $(LOCAL_PATH)/pbc/alloc.c \
                    $(LOCAL_PATH)/pbc/array.c \
                    $(LOCAL_PATH)/pbc/bootstrap.c \
                    $(LOCAL_PATH)/pbc/context.c \
                    $(LOCAL_PATH)/pbc/decode.c \
                    $(LOCAL_PATH)/pbc/map.c \
                    $(LOCAL_PATH)/pbc/pattern.c \
                    $(LOCAL_PATH)/pbc/proto.c \
                    $(LOCAL_PATH)/pbc/register.c \
                    $(LOCAL_PATH)/pbc/rmessage.c \
                    $(LOCAL_PATH)/pbc/wmessage.c \
                    $(LOCAL_PATH)/pbc/stringpool.c \
                    $(LOCAL_PATH)/pbc/varint.c \
                    $(LOCAL_PATH)/pbc/pbc-lua.c \
                    $(LOCAL_PATH)/lpeg/lpcap.c \
                    $(LOCAL_PATH)/lpeg/lpcode.c \
                    $(LOCAL_PATH)/lpeg/lpprint.c \
                    $(LOCAL_PATH)/lpeg/lptree.c \
                    $(LOCAL_PATH)/lpeg/lpvm.c \
                    $(LOCAL_PATH)/sproto/sproto.c \
                    $(LOCAL_PATH)/sproto/lsproto.c

LOCAL_SRC_FILES += \
                        $(LOCAL_PATH)/cjson/fpconv.c \
                        $(LOCAL_PATH)/cjson/lua_cjson.c \
                        $(LOCAL_PATH)/cjson/strbuf.c

ifeq ($(CC_USE_SQLITE),1)
LOCAL_SRC_FILES += \
                        $(LOCAL_PATH)/lsqlite3/sqlite3.c \
                        $(LOCAL_PATH)/lsqlite3/lsqlite3.c
endif

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ \
                           $(LOCAL_PATH)/cjson \
                           $(LOCAL_PATH)/zlib \
                           $(LOCAL_PATH)/debugger \
                           $(LOCAL_PATH)/filesystem \
                           $(LOCAL_PATH)/lpack \
                           $(LOCAL_PATH)/lsqlite3 \
                           $(LOCAL_PATH)/pbc \
                           $(LOCAL_PATH)/lpeg \
                           $(LOCAL_PATH)/sproto

LOCAL_C_INCLUDES := $(LOCAL_PATH)/ \
                    $(LOCAL_PATH)/cjson \
                    $(LOCAL_PATH)/zlib \
                    $(LOCAL_PATH)/debugger \
                    $(LOCAL_PATH)/filesystem \
                    $(LOCAL_PATH)/lpack \
                    $(LOCAL_PATH)/lsqlite3 \
                    $(LOCAL_PATH)/pbc \
                    $(LOCAL_PATH)/lpeg \
                    $(LOCAL_PATH)/sproto \
                    $(COCOS2DX_ROOT)/cocos \
                    $(COCOS2DX_ROOT)/external/lua/luajit/include

include $(BUILD_STATIC_LIBRARY)

iOS:
这个很简单直接添加进项目就可以了。
对于模拟器,像这样子添加到项目,sproto操作一样:


客户端准备-协议集成_第1张图片
步骤1
客户端准备-协议集成_第2张图片
步骤2

而对于实际的ios项目,步骤跟上面一样,但是要勾选上target iOS:


注意

lpeg引入也一样,然后再修改下lua_extensions_more.c(这里仅仅指出了修改的内容,可以看看我提供的文件)

// pbc
#include "pbc/pbc-lua.h"

// lpeg
#include "lpeg/lpcap.h"
#include "lpeg/lpcode.h"
#include "lpeg/lpprint.h"
#include "lpeg/lptree.h"
#include "lpeg/lptypes.h"
#include "lpeg/lpvm.h"

// sproto
#include "sproto/sproto.h"
#include "sproto/lsproto.h"

// sproto
{"sproto.core",luaopen_sproto_core},

// lpeg
{"lpeg", luaopen_lpeg}

// pbc
luaopen_protobuf_c(L); //pbc

2.编译我们的项目,把库的lua对应文件复制到我们的src目录。
这是我整理好的lualib,可以直接拿过去,test.lua文件都是可以删掉的,不过方便参考了。


更新带sproto:
http://pan.baidu.com/s/1nuZAziD
你可以直接拷贝我这个lualib到你的项目中,里面有相应的test文件,可以按照使用方法,写个Demo。

注意要添加一下搜索目录,以及引入正确,这个虽然简单如果没有经验的话还是会躺枪,一定要获取了writablePath,再组合文件夹路径作为搜索目录,不然Android下会搜索不到文件,这是我的经验,maybe can help you:

    -- 添加搜索路径
    local instFileUtils = cc.FileUtils:getInstance()

    -- 添加资源目录默认搜索路径
    local path = device.writablePath
    instFileUtils:addSearchPath(path)
    instFileUtils:addSearchPath(path.."res/")
    instFileUtils:addSearchPath(path.."src/")

    -- lib
    instFileUtils:addSearchPath("src/lualib/lpeg/")
    instFileUtils:addSearchPath("src/lualib/pbc/")

    instFileUtils:addSearchPath("res/pb/")

    -- 然后就可以这样引入了
    require("protobuf")

    local pbFilePath = cc.FileUtils:getInstance():fullPathForFilename("test.pb")
    buffer = cc.FileUtils:getInstance():getDataFromFile(pbFilePath)
    protobuf.register(buffer)

    -- pbc 简单测试
    local data = {}
    data.id = 111111
    data.name = "test hah"
    local packet = protobuf.encode("MsgTest", data)
    -- 在模拟器把packet tostring()会报错
    -- NSConcreteAttributedString initWithString:: nil value
    -- 然而这并没有什么影响,后面是可以decode出来的
    -- print(tostring(packet))
    print(string.format("packet => size: %s", #packet))

    data = protobuf.decode("MsgTest", packet)
    print(string.format("data => id: %s, num: %s", data.id, data.name))

    -- sproto 简单测试
    local sproto = require "sproto"
    local core = require "sproto.core"

    local sp = sproto.parse [[
    .MsgTest {
        id 0 : integer
        name 1 : string
    }
    ]]

    local data = {}
    data.id = 100000
    data.name = "quinsm"

    local packet = sp:encode("MsgTest", data)
    print(string.format("packet => size: %s", #packet))
    local data = sp:decode("MsgTest", packet)
    print(string.format("data => id: %s, num: %s", data.id, data.name))

运行截图

源码下载: http://pan.baidu.com/s/1o8aouuA

是不是很简单!其实集成这玩意儿并不难~只要多多尝试,现在我们客户端就已经做好了亲skynet屁股的准备,准备捂住你的鼻子。

你可能感兴趣的:(客户端准备-协议集成)