Error[8]: Undefined offset: 264, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述cocos2d-x lua 中使用protobuf并对http进行处理 本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链接 http://www.voidcn.com/article/p-uzwmdzfc-qn.html protobuf  Google的一个很好用的传输数据的封装 说实话Google的东西确实比较好用

cocos2d-x lua中使用protobuf并对http进行处理

本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok)

本博客链接

http://www.jb51.cc/article/p-uzwmdzfc-qn.html

protobuf Google的一个很好用的传输数据的封装 说实话Google的东西确实比较好用 所以我们前后端数据交换就用他了 不过Google没有对lua进行支持 还好社区有开源的大侠们贡献 找了所有关于lua protobuf 我只找到 云风的 pbc 修改相关cocos2d-x中的类可以正常使用。protoc-gen-lua 我在使用的时候 总是报截断数据 在修改后cocs2d-x中的类之后没有对protoc-gen-lua 进行测试是否是这个问题导致

1)集成 云风 云大侠的(博客)lua-pbc标准c写的protobuf 具体看pbc的帮助很轻松集成

2) 生成pb文件(我自己写了个mac中批处理生成所有.proto文件为.pb文件)把pb 和proto文件都加入到项目资源中

[objc] view plain copy #!/bin/sh #pb="pb" foriin*.proto do #echo$i #echo${i%.*}".pb" #echo${i%.*} #pbn=$i|cut-d. pbname=${i%.*}".pb" #echo$pbn #echo$pbname protoc--descriptor_set_out$pbname$i done echo"finish"

也可以用命令行手动生成

[cpp] protoc--descriptor_set_outaaa.pbaaa.proto 3) 本步骤可以忽略了,可以直接用io进行读取(AndroID是路径问题请看本文最下面解释) 在lua中使用如下代码(我用的是cocos2d-x中绑定的CCfileUtils中的获取文件的方式,不过要手动用tolua++进行绑定到lua,可以参考我上个文章中的绑定方式,云大侠中的 用lua io形式获取在相关了解中不能跨平台所有就用这个了) [JavaScript] localprotobuf=require"protobuf" localbuffer=CCfileUtils:sharedfileUtils():getfileData("entity/p_result.pb","r",0) --print(buffer) protobuf.register(buffer) 4) 本步骤可以忽略了,可以直接用io进行读取(AndroID是路径问题请看本文最下面解释) 上一步完成后我们要对提到的CCfileUtils.cpp中的类进行修改 如果不修改读文件pb文件会时好时坏 原因是 读文件的时候结束总是添加多余字节我也不清楚这个问题 进行修改cocos2d-xCCfileUtils.cpp的下面方法中的读取数据后处理并在tolua++ 中添加下面方法绑定到lua层

修改CCfileUtils.cp getfileData(constchar* pszfilename,constchar* pszMode,unsignedlong* pSize)方法(在最后添加\0,保证字节不多余)如下代码

unsignedchar*CCfileUtils::getfileData(constchar*pszfilename,char*pszMode,unsignedlong*pSize) { unsignedchar*pBuffer=NulL; CCAssert(pszfilename!=NulL&&pSize!=NulL&&pszMode!=NulL,"InvalIDparameters."); *pSize=0; { //readthefilefromharDWare std::stringfullPath=fullPathForfilename(pszfilename); file*fp=fopen(fullPath.c_str(),pszMode); CC_BREAK_IF(!fp); fseek(fp,SEEK_END); *pSize=ftell(fp); fseek(fp,SEEK_SET); pBuffer=newunsignedchar[*pSize]; *pSize=fread(pBuffer,sizeof(unsignedchar),*pSize,fp); fclose(fp); }while(0); if(*pSize>0&&pBuffer[*pSize]!=')'';' pBuffer[*pSize]=(!pBuffer)"Getdatafromfile(" @H_467_419@if; std::stringmsg=")Failed!"); msg.append(pszfilename).append("%s",msg.c_str()); cclOG(}pBuffer; } @H_467_419@returnlocalmajor={ "795f94a9-3466-41b4-bf16-043ba8081fab"

5)经过上一步骤lua层基本搞定可以创建本地的数据并encode成传输数据到服务器端了 如下代码

majorID=}"com.sj.web.proto.Major" ,major) localbuffer=protobuf.encode(6)我们客户端数据传输到服务器端 服务器端会返回数据给我们 同样我们接收的数据肯定也是protobuf数据了 用 protobuf.decode进行解数据localt=protobuf.decode( "com.sj.web.proto.Result" ,request:getResponseString())--tolua.cast(event.dataCString))--tolua.cast(event.dataCString,"CCString"):getCString())cclog(t)print(t.major.gender) print(t.major.majorID) print(t.user.username) 7)上一步中的数据是服务器端过来的数据,不过在http连接方面遇到了些小插曲 localhttp=require 'socket.http'

(1)我先前用的是quick-cocos2d-x-lua中封装的CChttpRequest的这个进行服务器端交互 不过不如愿 因为服务器端过来的数据中是protobuf进行处理过的数据 在进行调试跟踪后发现过来的数据中不定什么地方都有\0结束符 这个导致直接在lua中调研CChttpRequest中的获取string 方法数据被截断不能正常解析 我在CChttpRequest::getResponseString进行处理过来的数据处理掉\0 也不行

(2)由于项目中要用的短连接socket我先前已经集成好luasocket,其实这个开源的socket很好用 也有对http的支持果断用这个测试下服务器端回来的数据 让我小小喜悦了一下 丢到protobuf.decode中进行解析正是我要的数据 不过有个不好的地方 luasocket对socket有设置一个超时时间 就可以不阻塞线程 但是htpp方式我找遍了网站上的资料也没找到非阻塞式的 不过这个没关系比较可以正常跑protobuf了 集成一个线程框架就ok了呀 可以用协同线程 或者是lua llthreads 自己选择吧如果要用 luasocket的http 先附上luasocket的http代码

'ltn12' localltn12=require"" response_body="" request_body=http.post(u)localt={} @H_467_419@functionlocalr,c,h=http.request{ url=u, "POST" , method=headers={"Content-Type" ]= ["application/x-protobuf""Content-Length"]=#request_body,,108); List-style:decimal-leading-zero outsIDe; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [},sink=ltn12.sink.table(t)} r,h,t source=ltn12.source.string(request_body),248)"> end @H_467_419@return"http://www.baIDu.com" --url=r,body=http.post(http_URL)print(c) c~=200then @H_467_419@ifend return"protobuf" localprotobuf=require"entity/p_result_test.pb",0) localbuffer=CCfileUtils:sharedfileUtils():getfileData(--print(buffer)protobuf.register(buffer) "com.sj.web.proto.Result" ,body[1]) localt=protobuf.decode(cclog(t)(3)不过我没有用上面中提到的luasocket http 个人感觉还是直接用coco2d-x中的CChttpClIEnt比较好用也不用处理线程的东西 因为我通过这个测试过c++层中protobuf进行解析是完全没问题的所以我就模仿(1)中提到的CChttpRequest对cocos2d ::
extension :: CChttpClIEnt封装使用不过有点不顺利数据传到lua层还是不正常, 我就进行对处理获取的服务器数据如下 进行处理 又让我喜悦了 std::vector< char >*data=response->getResponseData(); std::stringstreammystream;(int i=0;i<data->size();i++){ @H_467_419@formystream<<(*data)[i]; //if((*data)[i]!='\0'){//mystream<<'\b'; //}else{ mResponseData=mystream.str();std::cout<<mystream.str()<<std::endl; //}"ddd:%s" ,mystream.str().c_str()); CCString*cstr=CCString::create(temp); cclog( //com::sj::web::proto::Result*r=newcom::sj::web::proto::Result::Result();ccluaValueDictdict; //r->ParseFromString(temp.c_str());"request" //cclog("ParseFromString:::::::::%d%s",r->resultcode(),r->release_major()->majorcode().c_str());]=ccluaValue::ccobjectValue( this dict[,"httpRequest");"data"]=ccluaValue::stringValue(mystream.str());//传值回到lua层 dict["dataCString"]=ccluaValue::ccobjectValue(cstr,"CCString" dict[);"dddd"]=ccluaValue::stringValue("dssddsdsds" dict[);LUA_FUNCTIONListener=(LUA_FUNCTION)response->gethttpRequest()->getUserData();ccluaStack*stack=ccluaEngine::defaultEngine()->getLuaStack();stack->clean(); stack->pushccluaValueDict(dict); lua_pushlstring m_state pushString(value.stringValue().c_str(),value.stringValue().length());

做好上一步进行修改cocos2d-x ccluaStack.cpp 方法pushccluaValue(....) 中 代码293行代码,修改如下(这样做可以直接使用完整方法代码为:(ccluaStack::pushccluaValue(,stringValue,length) 把所有数据压到lua上层)

returnconst
ccluaValue&value) voIDccluaValueTypetype=value.getType();(type==ccluaValueTypeInt)pushInt(value.intValue()); const ifif @H_467_419@return(type==ccluaValueTypefloat) @H_467_419@elsepushfloat(value.floatValue());(type==ccluaValueTypeBoolean)pushBoolean(value.booleanValue()); @H_467_419@return(type==ccluaValueTypestring) @H_467_419@if//pushString(value.stringValue().c_str()); @H_467_419@return @H_467_419@if(type==ccluaValueTypeDict) pushccluaValueDict(value.dictValue());(type==ccluaValueTypeArray) @H_467_419@ifpushccluaValueArray(value.arrayValue()); (type==ccluaValueTypeCCObject) @H_467_419@ifpushCCObject(value.ccobjectValue(),value.getCCObjectTypename().c_str()); } @H_467_419@if如有朋友能使用lua—>java进行浮点类型通信OK 迫切滴希望您共享我一份解决方案 已经验证过是androID中读取文件路径问题,我的方式是把proto写到本地后lua用io进行读取ok --其他平台

好了就介绍到这里吧希望对cocos2d-x lua 开发的同行们有所帮助 如果有什么好的protobuf对cocos2d-x lua的支持 或者是更方便的集成 也请贡献给我一份哟 谢谢

本人用风云的pbc 心得 总的来说还算可以

1)浮点类型:java—>lua 没问题;lua—>java 没通过。我们后端用的java 估计是lua对number浮点数类型进行decode的 有整形进行传递的时候导致没有进行对浮点类型转换(或者java对类型比较严格导致解码的时候对高地位转换失败所致) 由于开发效率前后端改成string进行传递(测试过protoc-gen-lua 也有这个问题)"entity/p_result.pb"

2)枚举类型 proto文件中序号从1开始计数 否则pbc pb文件加载失败

3)上面提到的加载pb文件的时候ios win 也可以根据 CCfileUtils获取pb文件路径后用 lua io进行注册,测试androID(我还是用上面提到的方法进行读文件)用这种方式没成功 应该是路径和权限问题导致())读不到文件

"rb" localfilePath=CCfileUtils:sharedfileUtils():fullPathForfilename()"*a" localaddr=io.open(filePath,addr:close() protobuffer=addr:readprotobuf.register(protobuffer--androID如下 localfilePath=callJava() protobuf.register(protobuffer) 转载一些自己感觉好的文章,只是为了记录,以后查找方便,大家尽量去阅读原文。 原文地址: [+++]

最近Google产品及服务全面禁封 表示对国内互联网管控的表示吐槽但是好的技术成果是无界的(我对protobuf的使用一如既往,如有想用的,请代理去下载吧) 对protobuf的使用总结

1)发现数据传输上字节上特别节省轻量,从这个优势上传输速度明显快过其他如Json,尤其适合游戏通信,如果是考虑到用户通信流量及带宽资源节省问题可以考虑

2)一点不好就是客户输出数据不全估计是pbc反序列化优化table对象问题 (和后端交互数据全靠java写的小客户端日志输出查看,只是为了方便查看后端返回数据) 然后回lua项目进行处理信息


[+++]

[+++]http://www.jb51.cc/article/p-uzwmdzfc-qn.html

总结

以上是内存溢出为你收集整理的cocos2d-x lua 中使用protobuf并对http进行处理全部内容,希望文章能够帮你解决cocos2d-x lua 中使用protobuf并对http进行处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 265, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述cocos2d-x lua 中使用protobuf并对http进行处理 本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链接 http://www.voidcn.com/article/p-uzwmdzfc-qn.html protobuf  Google的一个很好用的传输数据的封装 说实话Google的东西确实比较好用

cocos2d-x lua中使用protobuf并对http进行处理

本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok)

本博客链接

http://www.jb51.cc/article/p-uzwmdzfc-qn.html

protobuf Google的一个很好用的传输数据的封装 说实话Google的东西确实比较好用 所以我们前后端数据交换就用他了 不过Google没有对lua进行支持 还好社区有开源的大侠们贡献 找了所有关于lua protobuf 我只找到 云风的 pbc 修改相关cocos2d-x中的类可以正常使用。protoc-gen-lua 我在使用的时候 总是报截断数据 在修改后cocs2d-x中的类之后没有对protoc-gen-lua 进行测试是否是这个问题导致

1)集成 云风 云大侠的(博客)lua-pbc标准c写的protobuf 具体看pbc的帮助很轻松集成

2) 生成pb文件(我自己写了个mac中批处理生成所有.proto文件为.pb文件)把pb 和proto文件都加入到项目资源中

[objc] view plain copy #!/bin/sh #pb="pb" foriin*.proto do #echo$i #echo${i%.*}".pb" #echo${i%.*} #pbn=$i|cut-d. pbname=${i%.*}".pb" #echo$pbn #echo$pbname protoc--descriptor_set_out$pbname$i done echo"finish"

也可以用命令行手动生成

[cpp] protoc--descriptor_set_outaaa.pbaaa.proto 3) 本步骤可以忽略了,可以直接用io进行读取(AndroID是路径问题请看本文最下面解释) 在lua中使用如下代码(我用的是cocos2d-x中绑定的CCfileUtils中的获取文件的方式,不过要手动用tolua++进行绑定到lua,可以参考我上个文章中的绑定方式,云大侠中的 用lua io形式获取在相关了解中不能跨平台所有就用这个了) [JavaScript] localprotobuf=require"protobuf" localbuffer=CCfileUtils:sharedfileUtils():getfileData("entity/p_result.pb","r",0) --print(buffer) protobuf.register(buffer) 4) 本步骤可以忽略了,可以直接用io进行读取(AndroID是路径问题请看本文最下面解释) 上一步完成后我们要对提到的CCfileUtils.cpp中的类进行修改 如果不修改读文件pb文件会时好时坏 原因是 读文件的时候结束总是添加多余字节我也不清楚这个问题 进行修改cocos2d-xCCfileUtils.cpp的下面方法中的读取数据后处理并在tolua++ 中添加下面方法绑定到lua层

修改CCfileUtils.cp getfileData(constchar* pszfilename,constchar* pszMode,unsignedlong* pSize)方法(在最后添加\0,保证字节不多余)如下代码

unsignedchar*CCfileUtils::getfileData(constchar*pszfilename,char*pszMode,unsignedlong*pSize) { unsignedchar*pBuffer=NulL; CCAssert(pszfilename!=NulL&&pSize!=NulL&&pszMode!=NulL,"InvalIDparameters."); *pSize=0; { //readthefilefromharDWare std::stringfullPath=fullPathForfilename(pszfilename); file*fp=fopen(fullPath.c_str(),pszMode); CC_BREAK_IF(!fp); fseek(fp,SEEK_END); *pSize=ftell(fp); fseek(fp,SEEK_SET); pBuffer=newunsignedchar[*pSize]; *pSize=fread(pBuffer,sizeof(unsignedchar),*pSize,fp); fclose(fp); }while(0); if(*pSize>0&&pBuffer[*pSize]!=')'';' pBuffer[*pSize]=(!pBuffer)"Getdatafromfile(" @H_467_419@if; std::stringmsg=")Failed!"); msg.append(pszfilename).append("%s",msg.c_str()); cclOG(}pBuffer; } @H_467_419@returnlocalmajor={ "795f94a9-3466-41b4-bf16-043ba8081fab"

5)经过上一步骤lua层基本搞定可以创建本地的数据并encode成传输数据到服务器端了 如下代码

majorID=}"com.sj.web.proto.Major" ,major) localbuffer=protobuf.encode(6)我们客户端数据传输到服务器端 服务器端会返回数据给我们 同样我们接收的数据肯定也是protobuf数据了 用 protobuf.decode进行解数据localt=protobuf.decode( "com.sj.web.proto.Result" ,request:getResponseString())--tolua.cast(event.dataCString))--tolua.cast(event.dataCString,"CCString"):getCString())cclog(t)print(t.major.gender) print(t.major.majorID) print(t.user.username) 7)上一步中的数据是服务器端过来的数据,不过在http连接方面遇到了些小插曲 localhttp=require 'socket.http'

(1)我先前用的是quick-cocos2d-x-lua中封装的CChttpRequest的这个进行服务器端交互 不过不如愿 因为服务器端过来的数据中是protobuf进行处理过的数据 在进行调试跟踪后发现过来的数据中不定什么地方都有\0结束符 这个导致直接在lua中调研CChttpRequest中的获取string 方法数据被截断不能正常解析 我在CChttpRequest::getResponseString进行处理过来的数据处理掉\0 也不行

(2)由于项目中要用的短连接socket我先前已经集成好luasocket,其实这个开源的socket很好用 也有对http的支持果断用这个测试下服务器端回来的数据 让我小小喜悦了一下 丢到protobuf.decode中进行解析正是我要的数据 不过有个不好的地方 luasocket对socket有设置一个超时时间 就可以不阻塞线程 但是htpp方式我找遍了网站上的资料也没找到非阻塞式的 不过这个没关系比较可以正常跑protobuf了 集成一个线程框架就ok了呀 可以用协同线程 或者是lua llthreads 自己选择吧如果要用 luasocket的http 先附上luasocket的http代码

'ltn12' localltn12=require"" response_body="" request_body=http.post(u)localt={} @H_467_419@functionlocalr,c,h=http.request{ url=u, "POST" , method=headers={"Content-Type" ]= ["application/x-protobuf""Content-Length"]=#request_body,,108); List-style:decimal-leading-zero outsIDe; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [},sink=ltn12.sink.table(t)} r,h,t source=ltn12.source.string(request_body),248)"> end @H_467_419@return"http://www.baIDu.com" --url=r,body=http.post(http_URL)print(c) c~=200then @H_467_419@ifend return"protobuf" localprotobuf=require"entity/p_result_test.pb",0) localbuffer=CCfileUtils:sharedfileUtils():getfileData(--print(buffer)protobuf.register(buffer) "com.sj.web.proto.Result" ,body[1]) localt=protobuf.decode(cclog(t)(3)不过我没有用上面中提到的luasocket http 个人感觉还是直接用coco2d-x中的CChttpClIEnt比较好用也不用处理线程的东西 因为我通过这个测试过c++层中protobuf进行解析是完全没问题的所以我就模仿(1)中提到的CChttpRequest对cocos2d ::
extension :: CChttpClIEnt封装使用不过有点不顺利数据传到lua层还是不正常, 我就进行对处理获取的服务器数据如下 进行处理 又让我喜悦了 std::vector< char >*data=response->getResponseData(); std::stringstreammystream;(int i=0;i<data->size();i++){ @H_467_419@formystream<<(*data)[i]; //if((*data)[i]!='\0'){//mystream<<'\b'; //}else{ mResponseData=mystream.str();std::cout<<mystream.str()<<std::endl; //}"ddd:%s" ,mystream.str().c_str()); CCString*cstr=CCString::create(temp); cclog( //com::sj::web::proto::Result*r=newcom::sj::web::proto::Result::Result();ccluaValueDictdict; //r->ParseFromString(temp.c_str());"request" //cclog("ParseFromString:::::::::%d%s",r->resultcode(),r->release_major()->majorcode().c_str());]=ccluaValue::ccobjectValue( this dict[,"httpRequest");"data"]=ccluaValue::stringValue(mystream.str());//传值回到lua层 dict["dataCString"]=ccluaValue::ccobjectValue(cstr,"CCString" dict[);"dddd"]=ccluaValue::stringValue("dssddsdsds" dict[);LUA_FUNCTIONListener=(LUA_FUNCTION)response->gethttpRequest()->getUserData();ccluaStack*stack=ccluaEngine::defaultEngine()->getLuaStack();stack->clean(); stack->pushccluaValueDict(dict); lua_pushlstring m_state pushString(value.stringValue().c_str(),value.stringValue().length());

做好上一步进行修改cocos2d-x ccluaStack.cpp 方法pushccluaValue(....) 中 代码293行代码,修改如下(这样做可以直接使用完整方法代码为:(ccluaStack::pushccluaValue(,stringValue,length) 把所有数据压到lua上层)

returnconst
ccluaValue&value) voIDccluaValueTypetype=value.getType();(type==ccluaValueTypeInt)pushInt(value.intValue()); const ifif @H_467_419@return(type==ccluaValueTypefloat) @H_467_419@elsepushfloat(value.floatValue());(type==ccluaValueTypeBoolean)pushBoolean(value.booleanValue()); @H_467_419@return(type==ccluaValueTypestring) @H_467_419@if//pushString(value.stringValue().c_str()); @H_467_419@return @H_467_419@if(type==ccluaValueTypeDict) pushccluaValueDict(value.dictValue());(type==ccluaValueTypeArray) @H_467_419@ifpushccluaValueArray(value.arrayValue()); (type==ccluaValueTypeCCObject) @H_467_419@ifpushCCObject(value.ccobjectValue(),value.getCCObjectTypename().c_str()); } @H_467_419@if如有朋友能使用lua—>java进行浮点类型通信OK 迫切滴希望您共享我一份解决方案 已经验证过是androID中读取文件路径问题,我的方式是把proto写到本地后lua用io进行读取ok --其他平台

好了就介绍到这里吧希望对cocos2d-x lua 开发的同行们有所帮助 如果有什么好的protobuf对cocos2d-x lua的支持 或者是更方便的集成 也请贡献给我一份哟 谢谢

本人用风云的pbc 心得 总的来说还算可以

1)浮点类型:java—>lua 没问题;lua—>java 没通过。我们后端用的java 估计是lua对number浮点数类型进行decode的 有整形进行传递的时候导致没有进行对浮点类型转换(或者java对类型比较严格导致解码的时候对高地位转换失败所致) 由于开发效率前后端改成string进行传递(测试过protoc-gen-lua 也有这个问题)"entity/p_result.pb"

2)枚举类型 proto文件中序号从1开始计数 否则pbc pb文件加载失败

3)上面提到的加载pb文件的时候ios win 也可以根据 CCfileUtils获取pb文件路径后用 lua io进行注册,测试androID(我还是用上面提到的方法进行读文件)用这种方式没成功 应该是路径和权限问题导致())读不到文件

"rb" localfilePath=CCfileUtils:sharedfileUtils():fullPathForfilename()"*a" localaddr=io.open(filePath,addr:close() protobuffer=addr:readprotobuf.register(protobuffer--androID如下 localfilePath=callJava() protobuf.register(protobuffer) 转载一些自己感觉好的文章,只是为了记录,以后查找方便,大家尽量去阅读原文。 原文地址:

最近Google产品及服务全面禁封 表示对国内互联网管控的表示吐槽但是好的技术成果是无界的(我对protobuf的使用一如既往,如有想用的,请代理去下载吧) 对protobuf的使用总结

1)发现数据传输上字节上特别节省轻量,从这个优势上传输速度明显快过其他如Json,尤其适合游戏通信,如果是考虑到用户通信流量及带宽资源节省问题可以考虑

2)一点不好就是客户输出数据不全估计是pbc反序列化优化table对象问题 (和后端交互数据全靠java写的小客户端日志输出查看,只是为了方便查看后端返回数据) 然后回lua项目进行处理信息


[+++]

[+++]http://www.jb51.cc/article/p-uzwmdzfc-qn.html

总结

以上是内存溢出为你收集整理的cocos2d-x lua 中使用protobuf并对http进行处理全部内容,希望文章能够帮你解决cocos2d-x lua 中使用protobuf并对http进行处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 266, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述cocos2d-x lua 中使用protobuf并对http进行处理 本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链接 http://www.voidcn.com/article/p-uzwmdzfc-qn.html protobuf  Google的一个很好用的传输数据的封装 说实话Google的东西确实比较好用

cocos2d-x lua中使用protobuf并对http进行处理

本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok)

本博客链接

http://www.jb51.cc/article/p-uzwmdzfc-qn.html

protobuf Google的一个很好用的传输数据的封装 说实话Google的东西确实比较好用 所以我们前后端数据交换就用他了 不过Google没有对lua进行支持 还好社区有开源的大侠们贡献 找了所有关于lua protobuf 我只找到 云风的 pbc 修改相关cocos2d-x中的类可以正常使用。protoc-gen-lua 我在使用的时候 总是报截断数据 在修改后cocs2d-x中的类之后没有对protoc-gen-lua 进行测试是否是这个问题导致

1)集成 云风 云大侠的(博客)lua-pbc标准c写的protobuf 具体看pbc的帮助很轻松集成

2) 生成pb文件(我自己写了个mac中批处理生成所有.proto文件为.pb文件)把pb 和proto文件都加入到项目资源中

[objc] view plain copy #!/bin/sh #pb="pb" foriin*.proto do #echo$i #echo${i%.*}".pb" #echo${i%.*} #pbn=$i|cut-d. pbname=${i%.*}".pb" #echo$pbn #echo$pbname protoc--descriptor_set_out$pbname$i done echo"finish"

也可以用命令行手动生成

[cpp] protoc--descriptor_set_outaaa.pbaaa.proto 3) 本步骤可以忽略了,可以直接用io进行读取(AndroID是路径问题请看本文最下面解释) 在lua中使用如下代码(我用的是cocos2d-x中绑定的CCfileUtils中的获取文件的方式,不过要手动用tolua++进行绑定到lua,可以参考我上个文章中的绑定方式,云大侠中的 用lua io形式获取在相关了解中不能跨平台所有就用这个了) [JavaScript] localprotobuf=require"protobuf" localbuffer=CCfileUtils:sharedfileUtils():getfileData("entity/p_result.pb","r",0) --print(buffer) protobuf.register(buffer) 4) 本步骤可以忽略了,可以直接用io进行读取(AndroID是路径问题请看本文最下面解释) 上一步完成后我们要对提到的CCfileUtils.cpp中的类进行修改 如果不修改读文件pb文件会时好时坏 原因是 读文件的时候结束总是添加多余字节我也不清楚这个问题 进行修改cocos2d-xCCfileUtils.cpp的下面方法中的读取数据后处理并在tolua++ 中添加下面方法绑定到lua层

修改CCfileUtils.cp getfileData(constchar* pszfilename,constchar* pszMode,unsignedlong* pSize)方法(在最后添加\0,保证字节不多余)如下代码

unsignedchar*CCfileUtils::getfileData(constchar*pszfilename,char*pszMode,unsignedlong*pSize) { unsignedchar*pBuffer=NulL; CCAssert(pszfilename!=NulL&&pSize!=NulL&&pszMode!=NulL,"InvalIDparameters."); *pSize=0; { //readthefilefromharDWare std::stringfullPath=fullPathForfilename(pszfilename); file*fp=fopen(fullPath.c_str(),pszMode); CC_BREAK_IF(!fp); fseek(fp,SEEK_END); *pSize=ftell(fp); fseek(fp,SEEK_SET); pBuffer=newunsignedchar[*pSize]; *pSize=fread(pBuffer,sizeof(unsignedchar),*pSize,fp); fclose(fp); }while(0); if(*pSize>0&&pBuffer[*pSize]!=')'';' pBuffer[*pSize]=(!pBuffer)"Getdatafromfile(" @H_467_419@if; std::stringmsg=")Failed!"); msg.append(pszfilename).append("%s",msg.c_str()); cclOG(}pBuffer; } @H_467_419@returnlocalmajor={ "795f94a9-3466-41b4-bf16-043ba8081fab"

5)经过上一步骤lua层基本搞定可以创建本地的数据并encode成传输数据到服务器端了 如下代码

majorID=}"com.sj.web.proto.Major" ,major) localbuffer=protobuf.encode(6)我们客户端数据传输到服务器端 服务器端会返回数据给我们 同样我们接收的数据肯定也是protobuf数据了 用 protobuf.decode进行解数据localt=protobuf.decode( "com.sj.web.proto.Result" ,request:getResponseString())--tolua.cast(event.dataCString))--tolua.cast(event.dataCString,"CCString"):getCString())cclog(t)print(t.major.gender) print(t.major.majorID) print(t.user.username) 7)上一步中的数据是服务器端过来的数据,不过在http连接方面遇到了些小插曲 localhttp=require 'socket.http'

(1)我先前用的是quick-cocos2d-x-lua中封装的CChttpRequest的这个进行服务器端交互 不过不如愿 因为服务器端过来的数据中是protobuf进行处理过的数据 在进行调试跟踪后发现过来的数据中不定什么地方都有\0结束符 这个导致直接在lua中调研CChttpRequest中的获取string 方法数据被截断不能正常解析 我在CChttpRequest::getResponseString进行处理过来的数据处理掉\0 也不行

(2)由于项目中要用的短连接socket我先前已经集成好luasocket,其实这个开源的socket很好用 也有对http的支持果断用这个测试下服务器端回来的数据 让我小小喜悦了一下 丢到protobuf.decode中进行解析正是我要的数据 不过有个不好的地方 luasocket对socket有设置一个超时时间 就可以不阻塞线程 但是htpp方式我找遍了网站上的资料也没找到非阻塞式的 不过这个没关系比较可以正常跑protobuf了 集成一个线程框架就ok了呀 可以用协同线程 或者是lua llthreads 自己选择吧如果要用 luasocket的http 先附上luasocket的http代码

'ltn12' localltn12=require"" response_body="" request_body=http.post(u)localt={} @H_467_419@functionlocalr,c,h=http.request{ url=u, "POST" , method=headers={"Content-Type" ]= ["application/x-protobuf""Content-Length"]=#request_body,,108); List-style:decimal-leading-zero outsIDe; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [},sink=ltn12.sink.table(t)} r,h,t source=ltn12.source.string(request_body),248)"> end @H_467_419@return"http://www.baIDu.com" --url=r,body=http.post(http_URL)print(c) c~=200then @H_467_419@ifend return"protobuf" localprotobuf=require"entity/p_result_test.pb",0) localbuffer=CCfileUtils:sharedfileUtils():getfileData(--print(buffer)protobuf.register(buffer) "com.sj.web.proto.Result" ,body[1]) localt=protobuf.decode(cclog(t)(3)不过我没有用上面中提到的luasocket http 个人感觉还是直接用coco2d-x中的CChttpClIEnt比较好用也不用处理线程的东西 因为我通过这个测试过c++层中protobuf进行解析是完全没问题的所以我就模仿(1)中提到的CChttpRequest对cocos2d ::
extension :: CChttpClIEnt封装使用不过有点不顺利数据传到lua层还是不正常, 我就进行对处理获取的服务器数据如下 进行处理 又让我喜悦了 std::vector< char >*data=response->getResponseData(); std::stringstreammystream;(int i=0;i<data->size();i++){ @H_467_419@formystream<<(*data)[i]; //if((*data)[i]!='\0'){//mystream<<'\b'; //}else{ mResponseData=mystream.str();std::cout<<mystream.str()<<std::endl; //}"ddd:%s" ,mystream.str().c_str()); CCString*cstr=CCString::create(temp); cclog( //com::sj::web::proto::Result*r=newcom::sj::web::proto::Result::Result();ccluaValueDictdict; //r->ParseFromString(temp.c_str());"request" //cclog("ParseFromString:::::::::%d%s",r->resultcode(),r->release_major()->majorcode().c_str());]=ccluaValue::ccobjectValue( this dict[,"httpRequest");"data"]=ccluaValue::stringValue(mystream.str());//传值回到lua层 dict["dataCString"]=ccluaValue::ccobjectValue(cstr,"CCString" dict[);"dddd"]=ccluaValue::stringValue("dssddsdsds" dict[);LUA_FUNCTIONListener=(LUA_FUNCTION)response->gethttpRequest()->getUserData();ccluaStack*stack=ccluaEngine::defaultEngine()->getLuaStack();stack->clean(); stack->pushccluaValueDict(dict); lua_pushlstring m_state pushString(value.stringValue().c_str(),value.stringValue().length());

做好上一步进行修改cocos2d-x ccluaStack.cpp 方法pushccluaValue(....) 中 代码293行代码,修改如下(这样做可以直接使用完整方法代码为:(ccluaStack::pushccluaValue(,stringValue,length) 把所有数据压到lua上层)

returnconst
ccluaValue&value) voIDccluaValueTypetype=value.getType();(type==ccluaValueTypeInt)pushInt(value.intValue()); const ifif @H_467_419@return(type==ccluaValueTypefloat) @H_467_419@elsepushfloat(value.floatValue());(type==ccluaValueTypeBoolean)pushBoolean(value.booleanValue()); @H_467_419@return(type==ccluaValueTypestring) @H_467_419@if//pushString(value.stringValue().c_str()); @H_467_419@return @H_467_419@if(type==ccluaValueTypeDict) pushccluaValueDict(value.dictValue());(type==ccluaValueTypeArray) @H_467_419@ifpushccluaValueArray(value.arrayValue()); (type==ccluaValueTypeCCObject) @H_467_419@ifpushCCObject(value.ccobjectValue(),value.getCCObjectTypename().c_str()); } @H_467_419@if如有朋友能使用lua—>java进行浮点类型通信OK 迫切滴希望您共享我一份解决方案 已经验证过是androID中读取文件路径问题,我的方式是把proto写到本地后lua用io进行读取ok --其他平台

好了就介绍到这里吧希望对cocos2d-x lua 开发的同行们有所帮助 如果有什么好的protobuf对cocos2d-x lua的支持 或者是更方便的集成 也请贡献给我一份哟 谢谢

本人用风云的pbc 心得 总的来说还算可以

1)浮点类型:java—>lua 没问题;lua—>java 没通过。我们后端用的java 估计是lua对number浮点数类型进行decode的 有整形进行传递的时候导致没有进行对浮点类型转换(或者java对类型比较严格导致解码的时候对高地位转换失败所致) 由于开发效率前后端改成string进行传递(测试过protoc-gen-lua 也有这个问题)"entity/p_result.pb"

2)枚举类型 proto文件中序号从1开始计数 否则pbc pb文件加载失败

3)上面提到的加载pb文件的时候ios win 也可以根据 CCfileUtils获取pb文件路径后用 lua io进行注册,测试androID(我还是用上面提到的方法进行读文件)用这种方式没成功 应该是路径和权限问题导致())读不到文件

"rb" localfilePath=CCfileUtils:sharedfileUtils():fullPathForfilename()"*a" localaddr=io.open(filePath,addr:close() protobuffer=addr:readprotobuf.register(protobuffer--androID如下 localfilePath=callJava() protobuf.register(protobuffer) 转载一些自己感觉好的文章,只是为了记录,以后查找方便,大家尽量去阅读原文。 原文地址:

最近Google产品及服务全面禁封 表示对国内互联网管控的表示吐槽但是好的技术成果是无界的(我对protobuf的使用一如既往,如有想用的,请代理去下载吧) 对protobuf的使用总结

1)发现数据传输上字节上特别节省轻量,从这个优势上传输速度明显快过其他如Json,尤其适合游戏通信,如果是考虑到用户通信流量及带宽资源节省问题可以考虑

2)一点不好就是客户输出数据不全估计是pbc反序列化优化table对象问题 (和后端交互数据全靠java写的小客户端日志输出查看,只是为了方便查看后端返回数据) 然后回lua项目进行处理信息



[+++]http://www.jb51.cc/article/p-uzwmdzfc-qn.html

总结

以上是内存溢出为你收集整理的cocos2d-x lua 中使用protobuf并对http进行处理全部内容,希望文章能够帮你解决cocos2d-x lua 中使用protobuf并对http进行处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
cocos2d-x lua 中使用protobuf并对http进行处理_app_内存溢出

cocos2d-x lua 中使用protobuf并对http进行处理

cocos2d-x lua 中使用protobuf并对http进行处理,第1张

概述cocos2d-x lua 中使用protobuf并对http进行处理 本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链接 http://www.voidcn.com/article/p-uzwmdzfc-qn.html protobuf  Google的一个很好用的传输数据的封装 说实话Google的东西确实比较好用

cocos2d-x lua中使用protobuf并对http进行处理

本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok)

本博客链接

http://www.jb51.cc/article/p-uzwmdzfc-qn.html

protobuf Google的一个很好用的传输数据的封装 说实话Google的东西确实比较好用 所以我们前后端数据交换就用他了 不过Google没有对lua进行支持 还好社区有开源的大侠们贡献 找了所有关于lua protobuf 我只找到 云风的 pbc 修改相关cocos2d-x中的类可以正常使用。protoc-gen-lua 我在使用的时候 总是报截断数据 在修改后cocs2d-x中的类之后没有对protoc-gen-lua 进行测试是否是这个问题导致

1)集成 云风 云大侠的(博客)lua-pbc标准c写的protobuf 具体看pbc的帮助很轻松集成

2) 生成pb文件(我自己写了个mac中批处理生成所有.proto文件为.pb文件)把pb 和proto文件都加入到项目资源中

[objc] view plain copy #!/bin/sh #pb="pb" foriin*.proto do #echo$i #echo${i%.*}".pb" #echo${i%.*} #pbn=$i|cut-d. pbname=${i%.*}".pb" #echo$pbn #echo$pbname protoc--descriptor_set_out$pbname$i done echo"finish"

也可以用命令行手动生成

[cpp] protoc--descriptor_set_outaaa.pbaaa.proto 3) 本步骤可以忽略了,可以直接用io进行读取(AndroID是路径问题请看本文最下面解释) 在lua中使用如下代码(我用的是cocos2d-x中绑定的CCfileUtils中的获取文件的方式,不过要手动用tolua++进行绑定到lua,可以参考我上个文章中的绑定方式,云大侠中的 用lua io形式获取在相关了解中不能跨平台所有就用这个了) [JavaScript] localprotobuf=require"protobuf" localbuffer=CCfileUtils:sharedfileUtils():getfileData("entity/p_result.pb","r",0) --print(buffer) protobuf.register(buffer) 4) 本步骤可以忽略了,可以直接用io进行读取(AndroID是路径问题请看本文最下面解释) 上一步完成后我们要对提到的CCfileUtils.cpp中的类进行修改 如果不修改读文件pb文件会时好时坏 原因是 读文件的时候结束总是添加多余字节我也不清楚这个问题 进行修改cocos2d-xCCfileUtils.cpp的下面方法中的读取数据后处理并在tolua++ 中添加下面方法绑定到lua层

修改CCfileUtils.cp getfileData(constchar* pszfilename,constchar* pszMode,unsignedlong* pSize)方法(在最后添加\0,保证字节不多余)如下代码

unsignedchar*CCfileUtils::getfileData(constchar*pszfilename,char*pszMode,unsignedlong*pSize) { unsignedchar*pBuffer=NulL; CCAssert(pszfilename!=NulL&&pSize!=NulL&&pszMode!=NulL,"InvalIDparameters."); *pSize=0; { //readthefilefromharDWare std::stringfullPath=fullPathForfilename(pszfilename); file*fp=fopen(fullPath.c_str(),pszMode); CC_BREAK_IF(!fp); fseek(fp,SEEK_END); *pSize=ftell(fp); fseek(fp,SEEK_SET); pBuffer=newunsignedchar[*pSize]; *pSize=fread(pBuffer,sizeof(unsignedchar),*pSize,fp); fclose(fp); }while(0); if(*pSize>0&&pBuffer[*pSize]!=')'';' pBuffer[*pSize]=(!pBuffer)"Getdatafromfile(" @H_467_419@if; std::stringmsg=")Failed!"); msg.append(pszfilename).append("%s",msg.c_str()); cclOG(}pBuffer; } @H_467_419@returnlocalmajor={ "795f94a9-3466-41b4-bf16-043ba8081fab"

5)经过上一步骤lua层基本搞定可以创建本地的数据并encode成传输数据到服务器端了 如下代码

majorID=}"com.sj.web.proto.Major" ,major) localbuffer=protobuf.encode(6)我们客户端数据传输到服务器端 服务器端会返回数据给我们 同样我们接收的数据肯定也是protobuf数据了 用 protobuf.decode进行解数据localt=protobuf.decode( "com.sj.web.proto.Result" ,request:getResponseString())--tolua.cast(event.dataCString))--tolua.cast(event.dataCString,"CCString"):getCString())cclog(t)print(t.major.gender) print(t.major.majorID) print(t.user.username) 7)上一步中的数据是服务器端过来的数据,不过在http连接方面遇到了些小插曲 localhttp=require 'socket.http'

(1)我先前用的是quick-cocos2d-x-lua中封装的CChttpRequest的这个进行服务器端交互 不过不如愿 因为服务器端过来的数据中是protobuf进行处理过的数据 在进行调试跟踪后发现过来的数据中不定什么地方都有\0结束符 这个导致直接在lua中调研CChttpRequest中的获取string 方法数据被截断不能正常解析 我在CChttpRequest::getResponseString进行处理过来的数据处理掉\0 也不行

(2)由于项目中要用的短连接socket我先前已经集成好luasocket,其实这个开源的socket很好用 也有对http的支持果断用这个测试下服务器端回来的数据 让我小小喜悦了一下 丢到protobuf.decode中进行解析正是我要的数据 不过有个不好的地方 luasocket对socket有设置一个超时时间 就可以不阻塞线程 但是htpp方式我找遍了网站上的资料也没找到非阻塞式的 不过这个没关系比较可以正常跑protobuf了 集成一个线程框架就ok了呀 可以用协同线程 或者是lua llthreads 自己选择吧如果要用 luasocket的http 先附上luasocket的http代码

'ltn12' localltn12=require"" response_body="" request_body=http.post(u)localt={} @H_467_419@functionlocalr,c,h=http.request{ url=u, "POST" , method=headers={"Content-Type" ]= ["application/x-protobuf""Content-Length"]=#request_body,,108); List-style:decimal-leading-zero outsIDe; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [},sink=ltn12.sink.table(t)} r,h,t source=ltn12.source.string(request_body),248)"> end @H_467_419@return"http://www.baIDu.com" --url=r,body=http.post(http_URL)print(c) c~=200then @H_467_419@ifend return"protobuf" localprotobuf=require"entity/p_result_test.pb",0) localbuffer=CCfileUtils:sharedfileUtils():getfileData(--print(buffer)protobuf.register(buffer) "com.sj.web.proto.Result" ,body[1]) localt=protobuf.decode(cclog(t)(3)不过我没有用上面中提到的luasocket http 个人感觉还是直接用coco2d-x中的CChttpClIEnt比较好用也不用处理线程的东西 因为我通过这个测试过c++层中protobuf进行解析是完全没问题的所以我就模仿(1)中提到的CChttpRequest对cocos2d ::
extension :: CChttpClIEnt封装使用不过有点不顺利数据传到lua层还是不正常, 我就进行对处理获取的服务器数据如下 进行处理 又让我喜悦了 std::vector< char >*data=response->getResponseData(); std::stringstreammystream;(int i=0;i<data->size();i++){ @H_467_419@formystream<<(*data)[i]; //if((*data)[i]!='\0'){//mystream<<'\b'; //}else{ mResponseData=mystream.str();std::cout<<mystream.str()<<std::endl; //}"ddd:%s" ,mystream.str().c_str()); CCString*cstr=CCString::create(temp); cclog( //com::sj::web::proto::Result*r=newcom::sj::web::proto::Result::Result();ccluaValueDictdict; //r->ParseFromString(temp.c_str());"request" //cclog("ParseFromString:::::::::%d%s",r->resultcode(),r->release_major()->majorcode().c_str());]=ccluaValue::ccobjectValue( this dict[,"httpRequest");"data"]=ccluaValue::stringValue(mystream.str());//传值回到lua层 dict["dataCString"]=ccluaValue::ccobjectValue(cstr,"CCString" dict[);"dddd"]=ccluaValue::stringValue("dssddsdsds" dict[);LUA_FUNCTIONListener=(LUA_FUNCTION)response->gethttpRequest()->getUserData();ccluaStack*stack=ccluaEngine::defaultEngine()->getLuaStack();stack->clean(); stack->pushccluaValueDict(dict); lua_pushlstring m_state pushString(value.stringValue().c_str(),value.stringValue().length());

做好上一步进行修改cocos2d-x ccluaStack.cpp 方法pushccluaValue(....) 中 代码293行代码,修改如下(这样做可以直接使用完整方法代码为:(ccluaStack::pushccluaValue(,stringValue,length) 把所有数据压到lua上层)

returnconst
ccluaValue&value) voIDccluaValueTypetype=value.getType();(type==ccluaValueTypeInt)pushInt(value.intValue()); const ifif @H_467_419@return(type==ccluaValueTypefloat) @H_467_419@elsepushfloat(value.floatValue());(type==ccluaValueTypeBoolean)pushBoolean(value.booleanValue()); @H_467_419@return(type==ccluaValueTypestring) @H_467_419@if//pushString(value.stringValue().c_str()); @H_467_419@return @H_467_419@if(type==ccluaValueTypeDict) pushccluaValueDict(value.dictValue());(type==ccluaValueTypeArray) @H_467_419@ifpushccluaValueArray(value.arrayValue()); (type==ccluaValueTypeCCObject) @H_467_419@ifpushCCObject(value.ccobjectValue(),value.getCCObjectTypename().c_str()); } @H_467_419@if如有朋友能使用lua—>java进行浮点类型通信OK 迫切滴希望您共享我一份解决方案 已经验证过是androID中读取文件路径问题,我的方式是把proto写到本地后lua用io进行读取ok --其他平台

好了就介绍到这里吧希望对cocos2d-x lua 开发的同行们有所帮助 如果有什么好的protobuf对cocos2d-x lua的支持 或者是更方便的集成 也请贡献给我一份哟 谢谢

本人用风云的pbc 心得 总的来说还算可以

1)浮点类型:java—>lua 没问题;lua—>java 没通过。我们后端用的java 估计是lua对number浮点数类型进行decode的 有整形进行传递的时候导致没有进行对浮点类型转换(或者java对类型比较严格导致解码的时候对高地位转换失败所致) 由于开发效率前后端改成string进行传递(测试过protoc-gen-lua 也有这个问题)"entity/p_result.pb"

2)枚举类型 proto文件中序号从1开始计数 否则pbc pb文件加载失败

3)上面提到的加载pb文件的时候ios win 也可以根据 CCfileUtils获取pb文件路径后用 lua io进行注册,测试androID(我还是用上面提到的方法进行读文件)用这种方式没成功 应该是路径和权限问题导致())读不到文件

"rb" localfilePath=CCfileUtils:sharedfileUtils():fullPathForfilename()"*a" localaddr=io.open(filePath,addr:close() protobuffer=addr:readprotobuf.register(protobuffer--androID如下 localfilePath=callJava() protobuf.register(protobuffer) 转载一些自己感觉好的文章,只是为了记录,以后查找方便,大家尽量去阅读原文。 原文地址:

最近Google产品及服务全面禁封 表示对国内互联网管控的表示吐槽但是好的技术成果是无界的(我对protobuf的使用一如既往,如有想用的,请代理去下载吧) 对protobuf的使用总结

1)发现数据传输上字节上特别节省轻量,从这个优势上传输速度明显快过其他如Json,尤其适合游戏通信,如果是考虑到用户通信流量及带宽资源节省问题可以考虑

2)一点不好就是客户输出数据不全估计是pbc反序列化优化table对象问题 (和后端交互数据全靠java写的小客户端日志输出查看,只是为了方便查看后端返回数据) 然后回lua项目进行处理信息



http://www.jb51.cc/article/p-uzwmdzfc-qn.html

总结

以上是内存溢出为你收集整理的cocos2d-x lua 中使用protobuf并对http进行处理全部内容,希望文章能够帮你解决cocos2d-x lua 中使用protobuf并对http进行处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1034881.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存