flutter下protobuf编解码的问题,卡好几天。

发布于 1周前 作者 yuanlaile 来自 Flutter

后端使用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

6 回复

tcp 会存在粘包的问题,需要自己做分包处理。
可以做一个缓冲区,把数据接收下来,解析,足够一个包了,拿出来处理。

以前用 C 、C++都是这样做的,现在语言越来越高级,都很少直接处理 socket 了。

更多关于flutter下protobuf编解码的问题,卡好几天。的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


我发消息是用 http 发送的,怎么知道这个包的头部组成呢?

通过帧头帧尾来判断吧

已经上 http 协议了,那就按 HTTP 来解码了。HTTP 可没包大小的概念。先解析头,再解析 BODY.

有没有详细的流程解说,新手不太明白,或者说从哪个方向入手

针对你在Flutter下遇到的protobuf编解码问题,这里提供一些可能的解决方案和专业建议:

  1. 检查Proto文件:首先确认你的.proto文件是否正确编写,包括语法、字段类型和编号等。这是protobuf编解码的基础。

  2. 引入Protobuf库:确保你的Flutter项目中已经正确引入了protobuf库。在pubspec.yaml文件中添加protobuf依赖,并运行flutter pub get来安装。

  3. 生成Dart代码:使用protoc编译器生成Dart相关的Model类。确保使用的protoc版本与你的protobuf库版本兼容。

  4. 编码与解码

    • 编码时,创建protobuf对象并设置字段值,然后使用ProtobufUtil或类似的工具类进行编码。
    • 解码时,接收二进制数据并使用相应的解码方法将其转换回protobuf对象。
  5. 调试与测试:在编码和解码过程中,使用打印语句或调试器来跟踪数据的变化,确保数据在传输过程中没有损坏或丢失。

  6. 查阅文档与社区:如果问题依旧存在,建议查阅protobuf和Flutter的官方文档,或在Stack Overflow、GitHub等社区寻求帮助。

希望这些建议能帮助你解决Flutter下protobuf编解码的问题。如果问题仍未解决,可能需要更详细地检查你的代码和配置。

回到顶部