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

排查Flutter中_ClientSocketException异常的原因

排查与解决思路

核心问题:证书加载逻辑错误

你代码里的SecurityContext.setTrustedCertificatesBytes()是覆盖式设置信任证书,并非追加。连续调用三次该方法后,最终只有最后加载的task_certificate.pem会被保留。如果5555端口的Spring Boot服务使用的不是这个证书,就会触发SSL握手失败,进而导致连接重置。这也是Postman能正常访问(Postman默认信任系统证书或你手动导入了所有证书),但Flutter请求失败的关键原因。

具体排查与修复步骤

  1. 修复证书加载方式
    把三个PEM证书合并成一个文件(比如combined_certs.pem),然后一次性加载:

    static Future<IOClient> _getIOClient() async {
      ByteData combinedCert = await rootBundle.load('assets/combined_certs.pem');
      final SecurityContext securityContext = SecurityContext.defaultContext;
      securityContext.setTrustedCertificatesBytes(combinedCert.buffer.asUint8List());
    
      final HttpClient httpClient = HttpClient(context: securityContext);
      return IOClient(httpClient);
    }
    

    或者合并多个证书的字节数组后再传入,避免覆盖:

    List<int> allCertBytes = [];
    allCertBytes.addAll((await rootBundle.load('assets/user_certificate.pem')).buffer.asUint8List());
    allCertBytes.addAll((await rootBundle.load('assets/workTime_certificate.pem')).buffer.asUint8List());
    allCertBytes.addAll((await rootBundle.load('assets/task_certificate.pem')).buffer.asUint8List());
    securityContext.setTrustedCertificatesBytes(allCertBytes);
    
  2. 验证模拟器网络连通性

    • 用adb shell进入模拟器终端,执行ping 10.0.2.2确认主机可达。
    • 执行curl -v https://10.0.2.2:5555/testConnection,查看SSL握手过程是否有错误,对比Postman的请求日志,排除网络或端口映射问题。
  3. 检查服务端SSL配置

    • 确认Spring Boot服务的TLS版本兼容性:Flutter HttpClient默认支持TLS 1.2+,如果服务端禁用了旧版本协议,可手动指定:
      httpClient.allowedProtocols = [HttpClientProtocol.tls1_2, HttpClientProtocol.tls1_3];
      
    • 检查服务端是否开启双向SSL验证(要求客户端提供证书),如果是,你的代码还需要配置客户端证书(当前只配置了信任服务端证书)。
  4. 调整请求与客户端管理

    • 删除请求头中的"Connection": "Close",IOClient会自动管理连接池,手动设置可能导致不必要的连接中断。
    • 考虑复用IOClient实例(而非每次请求新建),减少资源开销和潜在的连接问题,但要确保证书配置正确。
  5. 开启日志定位问题

    • 开启Flutter HttpClient日志,查看SSL握手细节:
      HttpClient.enableTimelineLogging = true;
      
    • 查看Spring Boot服务的日志,确认是否有SSL握手失败、连接拒绝的相关记录。

内容的提问来源于stack exchange,提问作者marvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:51:06