在Isolate中运行Dart gRPC服务器时Socket流静默关闭排查求助
Dart gRPC服务器Socket接收流异常关闭排查
问题概述
我基于Flutter/Dart开发的gRPC服务器偶尔会出现静默断开连接的情况,此时客户端会收到如下GrpcError:HTTP/2 error: Connection error: Connection is being forcefully terminated. (errorCode: 10)
异常细节
- 服务器不会立刻感知到异常,只有当客户端收到错误并关闭流式RPC后,才会触发我编写的自定义关闭逻辑
- Wireshark抓包结果确认:服务器主动发起了连接关闭操作,客户端是后续响应方
- 问题已定位到dart-grpc依赖的Socket组件:接收消息的
Stream<Uint8List>触发了关闭事件,其onDone回调抛出上述错误并终止连接 - 仅接收流出现异常,发送端的IOSink仍正常工作——grpc库还能向客户端发送错误信息和尾部数据
触发场景与疑问
- 接收流的关闭无固定规律:有时在通过流式RPC发送命令并收到客户端响应后立即触发,有时会在10分钟后才出现
- 无法找到Socket(特指ServerSocket)的底层实现代码,无法确认触发流结束并调用onDone回调的具体原因
- 问题是在将gRPC服务器迁移到单独Isolate后出现的,但同期也进行了服务器代码重构,无法确定是否与Isolate迁移直接相关
补充信息
自2025年3月27日起,该Bug突然无法复现,怀疑是外部因素导致(如网络波动、防火墙规则变更或系统配置调整)
核心疑问
什么原因会导致Socket的接收流(Stream<Uint8List>)单独关闭?
内容的提问来源于stack exchange,提问作者ljbkusters
相关产品推荐
相关产品推荐

