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
相关产品推荐
相关产品推荐

