Flutter对接Python Socket获取JSON数据解码偶现FormatException异常
问题根本原因
你的偶现格式解析异常是TCP传输特性和Flutter侧接收逻辑错误共同导致的:
- TCP是面向流的传输协议,没有内置消息边界,服务端一次性发送的完整JSON数据,在网络传输过程中可能被拆分成多个数据包分批次到达客户端
- 你当前的Flutter代码中,每次Socket收到数据包时直接用新的内容覆盖
result变量,仅保留了最后一次到达的数据包内容,最终拼接出来的字符串是不完整的JSON,所以触发格式解析异常 - 物理设备的网络抖动比模拟器更明显,数据包拆分的概率更高,所以报错频率也更高
修复方案
1. Flutter侧修改接收逻辑,累计拼接所有收到的字节
import 'dart:convert'; import 'dart:io'; void getData({String ip, String port, String code}) async{ // 用BytesBuilder累计所有收到的字节,避免字符串拼接的编码错误 BytesBuilder bytesBuilder = BytesBuilder(); await Socket.connect(ip, int.parse(port)).then((socket) async { print('Connected to: ' '${socket.remoteAddress.address}:${socket.remotePort}'); socket.listen((data) { // 累计所有收到的字节,不要直接覆盖 bytesBuilder.add(data); }, onDone: () { print("Done"); // 所有数据接收完成后再统一转字符串、解码JSON String result = utf8.decode(bytesBuilder.toBytes()); try { setState(() { data = json.decode(result); }); print(data); } catch(e) { print('JSON解析异常: $e, 原始内容: $result'); // 可在这里添加重试逻辑或者用户提示 } socket.destroy(); }); socket.write(code); }); }
2. 可选优化(彻底避免边界问题)
如果后续JSON数据体积可能变大,建议在传输层加简单的协议规则:
- 服务端发送数据前,先发送4字节的内容长度标识,再发送实际的JSON内容
- 客户端先读取4字节拿到数据总长度,等累计接收的字节长度匹配总长度后再做解码
内容的提问来源于stack exchange,提问作者Shajko
相关产品推荐
相关产品推荐

