天天看点

ToLua学习笔记,通信(一)

ToLua框架里提供了常用的通信工具,包括Socket通信类,cjson库,protobuf库,sproto库。其中所有协议都需要依赖于Socket通信。但框架原本的SocketClient类有以下几个缺点:

1:接收消息拆包粘包写的效率不高

2:Socket类和NetworkManager类互相引用,封装的不够好

3:经过测试,收消息函数无响应

对此需要对SocketClient类重新封装:

1:修改解析函数

ToLua学习笔记,通信(一)
ToLua学习笔记,通信(一)
ToLua学习笔记,通信(一)
ToLua学习笔记,通信(一)

2:增加事件回调函数代替直接调用

ToLua学习笔记,通信(一)

对NetworkManager做一些修改:

ToLua学习笔记,通信(一)
ToLua学习笔记,通信(一)

SocketClient每次收到消息都会返回一个ByteBuffer对象,然后通过上图Update发送到Network.lua脚本的OnReceive函数。注意红框部分,原框架中并没有这句,但是如果不加,下边的调用就无效。

按照下图,创建Network.lua脚本:

ToLua学习笔记,通信(一)
ToLua学习笔记,通信(一)

到此通信已经有了。但是真正通信时是需要有协议的,ToLua框架提供了Protocal.lua用于定义协议号如上图,内容如下图:

ToLua学习笔记,通信(一)

ToLua的协议格式为:包长度(ushort,2字节)+传输类型(ushort,2字节)+协议号(ushort,2字节)+消息体,最后一起转化为byte[]。

我这里把协议格式改为包长度(ushort,2字节)+协议号(ushort,2字节)+消息体。

ushort的范围是0-65535,所以对于协议号的大小和协议包的长度表示应该足够用了。

为了写入和读取Byte[]方便,ToLua提供了ByteBuffer类,用于读写各类型数据,如下所示:

ToLua学习笔记,通信(一)

要想使用networkMgr,需要require "lua/define",其中公开了常用的一些管理器:

ToLua学习笔记,通信(一)

一旦谈到通信,就一定存在大小端问题,ByteBuffer默认对Float,Double类型都做了小端转换。另外ToLua还提供了一个专门的Converter类,用于字节处理

为了测试需要,我写了一个简单的服务端解析类:

ToLua学习笔记,通信(一)
ToLua学习笔记,通信(一)

此类模拟了前端ByteBuffer类,一次解析一个数据包,并未做拆包粘包处理,简单的使用如下:

ToLua学习笔记,通信(一)

到此基本的Socket通信已经介绍完,但是还有个问题,那就是中文字符串的传输还很难处理,希望高人指点。

最后提供服务端的代码下载,请用vs2015打开

继续阅读