dart - 如何编码和解码来自 netty 服务器的 protobuf 消息(dart/flutter)
问题描述
我正在尝试解码来自 netty 服务器的消息,但我不完全确定解码的数据是否正确解码。我是否需要对 dart 套接字做任何事情以使其与从 netty 发送的 protobuf 消息一起工作?在写任何消息之前我还需要做任何事情吗?每次接收数据或调用 onDone 时,我是否还要继续解析?
Socket.connect(ip, port).then((Socket sock) {
print("Connected");
socket = sock;
socket.setOption(SocketOption.tcpNoDelay, true);
socket.listen(onReceive,
onError: (e) {
print('Server error: $e');
},
onDone: onDoneEvent,
cancelOnError: false);
});
服务器通道处理程序:
p.addLast(new ProtobufVarint32FrameDecoder());
p.addLast(new MultiplePacketDecoder(decoders));
p.addLast(new ProtobufVarint32LengthFieldPrepender());
p.addLast(new ProtobufEncoder());
p.addLast(processingHandler);
编辑
哦,顺便说一句,每当我尝试解析消息时,我都会收到此错误
E/flutter (25389): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
E/flutter (25389): #0 CodedBufferReader.readTag (package:protobuf/src/protobuf/coded_buffer_reader.dart:144:7)
E/flutter (25389): #1 _mergeFromCodedBufferReader (package:protobuf/src/protobuf/coded_buffer.dart:34:21)
E/flutter (25389): #2 GeneratedMessage.mergeFromBuffer (package:protobuf/src/protobuf/generated_message.dart:173:5)
E/flutter (25389 My class): #3 PacketHandler.parseFromBytes (package:chatclientflutter/backend/packethandler.dart:32:26)
E/flutter (25389 My class): #4 Client.onDoneEvent (package:chatclientflutter/backend/client.dart:77:46)
E/flutter (25389): #5 _rootRun (dart:async/zone.dart:1120:38)
E/flutter (25389): #6 _CustomZone.run (dart:async/zone.dart:1021:19)
E/flutter (25389): #7 _CustomZone.runGuarded (dart:async/zone.dart:923:7)
E/flutter (25389): #8 _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:389:13)
E/flutter (25389): #9 _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:399:15)
E/flutter (25389): #10 _BufferingStreamSubscription._close (dart:async/stream_impl.dart:283:7)
E/flutter (25389): #11 _SyncStreamController._sendDone (dart:async/stream_controller.dart:772:19)
E/flutter (25389): #12 _StreamController._closeUnchecked (dart:async/stream_controller.dart:629:7)
E/flutter (25389): #13 _StreamController.close (dart:async/stream_controller.dart:622:5)
E/flutter (25389): #14 _Socket._onData (dart:io-patch/socket_patch.dart:1781:21)
E/flutter (25389): #15 _rootRunUnary (dart:async/zone.dart:1136:13)
E/flutter (25389): #16 _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter (25389): #17 _CustomZone.runUnaryGuarded (dart:async/zone.dart:931:7)
E/flutter (25389): #18 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336:11)
E/flutter (25389): #19 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:263:7)
E/flutter (25389): #20 _SyncStreamController._sendData (dart:async/stream_controller.dart:764:19)
E/flutter (25389): #21 _StreamController._add (dart:async/stream_controller.dart:640:7)
E/flutter (25389): #22 _StreamController.add (dart:async/stream_controller.dart:586:5)
E/flutter (25389): #23 new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1330:35)
E/flutter (25389): #24 _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:837:18)
E/flutter (25389): #25 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (25389): #26 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
解决方案
请检查您的标头,如果您的标头包含 'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits'。它不起作用。
推荐阅读
- django - 为什么在我的 Django 应用程序中无法获取当前用户的关注用户?
- android - 即使使用容器 ID,FindFragmentById 也会返回 null
- javascript - 在非锚哈希链接上禁用平滑滚动?
- java - 将 JSoup 传递给 String []
- blockchain - 智能合约回退作为一个包罗万象的委托调用
- python - Python:这里有什么错误?输出不断产生再试一次
- python - 如何打破python中行包含的pandas数据帧中断
- javascript - R Shiny Datatable 的预过滤数据
- git - inotify:监视除 .gitignore 中的文件之外的文件更改?
- java - 如何从 Java 中的 URL 打印出以 JSON 格式提供的查看器列表?