近来在家撸码想撸一下公司产品现有业务用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方法可以直接将二进制解析成对象。
前人种树,后人乘凉,希望这篇文章可以帮到你!