flutter下protobuf编解码的问题,卡好几天。
后端使用netty+protobuf 协议
通过暴露 socket 端口,客户端进行 socket 连接
服务端编解码器如下:
public class SocketServerInitializer extends ChannelInitializer<Channel> {
@Override
protected void initChannel(Channel ch) throws Exception {
// 31 秒没有向客户端发送消息就发生心跳
ch.pipeline().addLast(new IdleStateHandler(31, 0, 0))
// google Protobuf 编解码
.addLast(new ProtobufVarint32FrameDecoder())
.addLast(new ProtobufDecoder(WSBaseReqProtoOuterClass.WSBaseReqProto.getDefaultInstance()))
.addLast(new ProtobufVarint32LengthFieldPrepender())
.addLast(new ProtobufEncoder())
.addLast(new SocketServerHandler());
}
}
客户端使用 flutter 编写:
await Socket.connect('172.16.0.193', 9002).then((socket) {
connectFlag = true;
update();
/// 创建连接鉴权
socket.add(buildWSBaseReqProto(1, info.sid, info.uid));
/// 开始维持心跳, 每 30s 进行一次心跳连接
Timer.periodic(Duration(seconds: 30), (timer) {
socket.add(buildWSBaseReqProto(0, info.sid, info.uid));
});
int HeaderLength = 2
/// 开始监听 socket 记录
socket.listen((event) {
WSBaseResProto res = WSBaseResProto.fromBuffer(event.sublist(HeaderLength, event.length));
msgList.add(res);
update();
});
});
在最后监听的方法中没有做粘包、解包处理动作,所以有时候能收到消息,有时候收不到。主要是不懂怎么处理这个消息头长度的问题,希望有大佬指点一下。
flutter下protobuf编解码的问题,卡好几天。
更多关于flutter下protobuf编解码的问题,卡好几天。的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
tcp 会存在粘包的问题,需要自己做分包处理。
可以做一个缓冲区,把数据接收下来,解析,足够一个包了,拿出来处理。
以前用 C 、C++都是这样做的,现在语言越来越高级,都很少直接处理 socket 了。
更多关于flutter下protobuf编解码的问题,卡好几天。的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
我发消息是用 http 发送的,怎么知道这个包的头部组成呢?
通过帧头帧尾来判断吧
已经上 http 协议了,那就按 HTTP 来解码了。HTTP 可没包大小的概念。先解析头,再解析 BODY.
有没有详细的流程解说,新手不太明白,或者说从哪个方向入手
针对你在Flutter下遇到的protobuf编解码问题,这里提供一些可能的解决方案和专业建议:
-
检查Proto文件:首先确认你的
.proto
文件是否正确编写,包括语法、字段类型和编号等。这是protobuf编解码的基础。 -
引入Protobuf库:确保你的Flutter项目中已经正确引入了protobuf库。在
pubspec.yaml
文件中添加protobuf依赖,并运行flutter pub get
来安装。 -
生成Dart代码:使用protoc编译器生成Dart相关的Model类。确保使用的protoc版本与你的protobuf库版本兼容。
-
编码与解码:
- 编码时,创建protobuf对象并设置字段值,然后使用ProtobufUtil或类似的工具类进行编码。
- 解码时,接收二进制数据并使用相应的解码方法将其转换回protobuf对象。
-
调试与测试:在编码和解码过程中,使用打印语句或调试器来跟踪数据的变化,确保数据在传输过程中没有损坏或丢失。
-
查阅文档与社区:如果问题依旧存在,建议查阅protobuf和Flutter的官方文档,或在Stack Overflow、GitHub等社区寻求帮助。
希望这些建议能帮助你解决Flutter下protobuf编解码的问题。如果问题仍未解决,可能需要更详细地检查你的代码和配置。