美文网首页Kiss Skynet's Ass.程序员
客户端准备-协议集成

客户端准备-协议集成

作者: 回忆并快 | 来源:发表于2016-07-14 21:02 被阅读750次

基于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 步骤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屁股的准备,准备捂住你的鼻子。

相关文章

  • 客户端准备-协议集成

    基于Quick-Cocos2dx-Community3.6.2(编译运行我就不多说,有需要可以网上找下)https...

  • 国密SSL VPN握手抓包分析

    准备工作 Windows PC电脑;国密SSL VPN客户端(浏览器);Wireshark客户端(需支持国密协议版...

  • grpc示例

    准备工作 目录结构 协议 服务器端 服务器端Makefile 客户端 客户端Makefile Makefile 编译运行

  • [翻译]squbs官网之5 实现HTTP(s)服务

    概述 HTTP是最普遍的集成协议。它是 web 服务的基础,包括客户端和服务器端)。Akka HTTP 提供了强大...

  • ajax跨域请求

    JSNOP是一个非官方的协议,它允许在服务器端集成script tags返回至客户端,通过JavaScript c...

  • 高德地图导航跳转导航栏被遮住的问题;

    AMapNavi 一次项目中,需要用到高德导航,APP中集成,并非跳转第三方客户端当我集成好高德SDK准备跳转,测...

  • HTTP协议

    协议:协议的甲乙双方,就是客户端(浏览器)和服务器理解成双方通信的格式 请求协议(客户端发送请求时) 响应协议(服...

  • 图解HTTP之简单的HTTP协议

    1.HTTP协议用于客户端和服务器端之间的通信 HTTP协议和TCP/IP协议族内的其他众多的协议相同,用于客户端...

  • 前端必知必会HTTP请求系列(二)简单一点的HTTP协议

    http协议用户客户端和服务器之间的通信 http协议和TCP/IP协议族内的其他众多协议相同,用于客户端和服务器...

  • nginx配置文件,配置虚拟主机

    HTTP协议 HTTP是客户端与服务端之间请求和应答的标准; 全名叫做: 超文本传输协议; HTTP协议在客户端与...

网友评论

  • some1:我折腾了半天,终于把楼主第一步在vs2013下编译好了,跟楼主的包不一样。如果谁碰到我的问题,可以试试下载我的包放到quick引擎目录下编译试试。然后第二步的包我用的楼主的,可以正常运行。http://pan.baidu.com/s/1eRCupzk
  • Mqlittleluck:编译player,出现这个错误cocos2d: [LUA ERROR] [string "framework/cocos2dx/NodeEx.lua"]:45: attempt to index local 'Node' (a nil value)
    你知道是什么原因吗
    回忆并快:@iloster 这个不是集成会导致的问题,你的版本是哪个,这个是连全局的Node的找不到了,是不是碰到哪些地方出问题了。

本文标题:客户端准备-协议集成

本文链接:https://www.haomeiwen.com/subject/tjzejttx.html