Flutter Socket+Protobuf

近来在家撸码想撸一下公司产品现有业务用Flutter去实现下。主要有一个核心功能就是Socket进行发送和接收消息,Socket或WebSocket一搜一大把,而且用着都没什么问题。主要问题在于发送和解析协义上。这里网上搜的都没有讲的很细。主要就是协议长度和位数关系上以及大小端进行处理(这里不了解大小端的可以自行百度)。一般协议都使用小端,但Dart默认大端。所以在发送协议和读取协议的时候要特别注意下。

//包头部分

ByteData  header =ByteData(包的大小);

int byteOffset=0;//索引号

header.setInt32(byteOffset, 传数的二进制占四个字节,Endian.little);

byteOffset+=4;

header.setInt16(byteOffset, 传输的二进制占两个字节,Endian.little);

byteOffset+=2;

header.setInt8(byteOffset, 传字的二进掉一个字节,一个字节的不涉及到大小端);

byteOffset+=1;

上面是包头部份,一般在包头后还要传输协议内容

Protobuf的对象中有个buffer.asUint8List(),会返回一个Llist

直接一追加就可以了

header.buffer.asUint8List()+protobufb.buffer.asUnit8List()


关于解析同理也很简单,但是网上都没说到点上。。。

Socket收到消息回传回的是一个List,按照上面发送消息反向的套路就是

Uint8List byteArray =Uint8List.fromList(list);

ByteBuffer buffer = byteArray.buffer;

ByteData data =new ByteData.view(buffer);

拿到ByteData,就按位解析就OK了,记住取协议头的时候setUint32就要用getUnint32取去,要不然会乱。。

协议头取完剩上的就是协议返回的需要的内容了,Protobuf中对象有一个fromBuffer方法可以直接将二进制解析成对象。


前人种树,后人乘凉,希望这篇文章可以帮到你!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。