网络协议

在做客户端与服务器通信之前,先约定消息包的格式,例如:整个包的长度+消息类型+消息体数据内容

为什么发送的每条消息数据前面要加个长度的字段?
TCP的协议中,包的接收顺序就是包发送时候的顺序, 你收到的时候先将长度这个字段解析出来,然后读入接下来的data内容,
粘包:如果data内容过长(大于这个包的长度),那可能是几个包粘在一块儿了,只读入当前包的内容。
断包:如果不足(小于这个包的长度),证明出现断包的情况,缓存下来,等下次收到包的时候,肯定显示上次收到包的内容了,拼在一块儿解出来。

那么就得把消息包转化成byte[],然后发出给服务器。服务器接收,然后解析。注意字节序(大端,小端)的问题

你可以自定义结构体,然后里面每个类型都去转成字节数组。那太蛋疼,直接抛弃~!

Json,自然是可以的,只是数据量大,浪费带宽。弱联网完全可以用的,强交互的自然不用咯。
自动化的工具的话,可以看我的另一篇文章:Excel转Json,Json转CSharp
unity客户端用LitJson,支持多层嵌套,之前IOS会报JIT错,现在好像不会了。
LitJson可以直接把一个类的对象转成json字符串,然后我们再把字符串转成字节数组,发出去。
接受的话,把字节数组先转成json字符串,然后再转为一个类对象。
Java服务器的话,可以用Alibaba的FastJson。

protobuf(google)传送门:https://github.com/google/protobuf
优点就是:一份消息协议.proto文件,然后用工具自动化生成多平台的消息结构,减少了重复大量工作量和人为出错。
unity客户端的话,因为官方没有提供.net版本,所以用protobuf-net(第三方)传送门:https://github.com/mgravell/protobuf-net

关于protobuf_lua_gen,pbc,sproto
请参考:http://bbs.ulua.org/article/ngui/simpleframework_base4.html
或者直接去云风的blog找去

posted @ 2016-05-13 11:39  Joe师傅  阅读(250)  评论(0编辑  收藏  举报