You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 13:15:09