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

Flutter在SIT/UAT环境调用API频繁触发SocketException问题求助

解决方案:Connection reset by peer (errno=104)

常见原因及对应修复手段

1. 调整Keep-Alive连接策略

你当前代码设置了connection: keep-alive,测试环境服务器可能对长连接支持不佳,或连接回收机制与客户端不匹配。先尝试移除该头,改用短连接:

HttpClient client = HttpClient();
HttpClientRequest request = await client.postUrl(Uri.parse("https://ex.in/mobi/api/v1/dashboard/mob"));
request.headers.set('content-type', "application/json");
// 移除 connection: keep-alive 配置
request.write(encrtptedRequestData);
HttpClientResponse _httpResponse = await request.close();

若必须使用长连接,给HttpClient设置明确的超时参数:

HttpClient client = HttpClient()
  ..connectionTimeout = const Duration(seconds: 10)
  ..idleTimeout = const Duration(seconds: 30);

2. 添加请求重试逻辑

测试环境网络或服务器稳定性较差时,连接重置多为偶发问题,可给请求增加重试机制(示例最多重试3次):

Future<HttpClientResponse> sendRequest(String url, String data) async {
  int retryCount = 0;
  const maxRetries = 3;
  while (retryCount < maxRetries) {
    try {
      HttpClient client = HttpClient();
      HttpClientRequest request = await client.postUrl(Uri.parse(url));
      request.headers.set('content-type', "application/json");
      request.write(data);
      return await request.close();
    } on SocketException catch (e) {
      retryCount++;
      if (retryCount == maxRetries) rethrow;
      await Future.delayed(const Duration(milliseconds: 500));
    }
  }
  throw Exception("已达最大重试次数");
}

3. 排查服务器端配置

联系SIT/UAT环境运维或后端同学确认:

  • 服务器防火墙/安全组是否限制了客户端IP的连接数
  • 服务器连接超时、最大连接数配置是否合理
  • 负载均衡器是否存在异常的连接回收策略

4. 替换为Dio库优化请求管理

Dio库自带更完善的连接池、超时控制和错误处理,比原生HttpClient更适配复杂网络场景:

import 'package:dio/dio.dart';

final dio = Dio();

Future<Response> sendRequest(String data) async {
  try {
    return await dio.post(
      "https://ex.in/mobi/api/v1/dashboard/mob",
      data: data,
      options: Options(
        headers: {'Content-Type': 'application/json'},
        sendTimeout: const Duration(seconds: 10),
        receiveTimeout: const Duration(seconds: 10),
      ),
    );
  } catch (e) {
    rethrow;
  }
}

如需更灵活的重试规则,可配合dio_retry插件实现自动重试。

5. 验证加密数据完整性

你发送的是加密后的encrtptedRequestData,若加密过程出现数据截断、格式错误,服务器可能直接重置连接。可临时在测试环境发送明文请求对比,或打印加密数据长度、格式,确认是否为加密环节问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:27:11