Flutter Dio上传文件至远程服务器遇SocketException连接拒绝问题
问题定位与解决方案
问题归属
这个错误属于服务端配置问题。Socket.IO能正常通信,说明Android设备与服务器的网络链路是通的,连接拒绝是因为服务器未在请求的端口上监听文件上传服务,或是防火墙拦截了该端口的请求。
具体排查与解决步骤
确认服务端文件上传接口的监听端口与路径
检查Node.js服务代码,确认文件上传接口(比如基于Express搭建的)的监听端口(如app.listen(3000)中的3000)和具体路径(如/upload)。当前Dio请求仅填写了服务器地址,未指定端口和路径,若服务端未使用默认80端口,必须补充完整,示例:Response response = await Dio().post('http://h1013496.stratoserver.net:3000/upload', data: data);检查Ubuntu服务器的防火墙规则
Ubuntu 22.04默认使用ufw防火墙,执行以下命令排查:- 查看当前防火墙状态:
sudo ufw status - 若文件上传接口使用的端口(如3000)未放行,执行命令开放:
sudo ufw allow 3000/tcp - 额外注意:你的服务器是Strato云主机,需在Strato后台控制台检查云服务商层面的防火墙规则,确保对应端口已放行,这是容易忽略的关键环节。
- 查看当前防火墙状态:
验证服务端接口的可用性
在本地终端用curl直接测试服务器的文件上传接口,示例:curl -X POST -F "file=@本地测试文件路径" -F "x-api-key=apikey" http://h1013496.stratoserver.net:3000/upload若
curl也返回连接拒绝,说明服务端确实存在端口未监听或防火墙拦截问题;若curl能正常响应,再排查客户端代码细节。客户端代码补充检查
- Android 9及以上默认禁止明文HTTP请求,若服务器未配置HTTPS,需在
AndroidManifest.xml的<application>标签中添加:
你Socket.IO能正常通信大概率已配置,但可再确认。android:usesCleartextTraffic="true" - 确保Dio请求参数与服务端要求一致,部分服务端要求
x-api-key放在请求头而非FormData中,若为这种情况,需修改代码:Response response = await Dio().post( 'http://h1013496.stratoserver.net:3000/upload', data: data, options: Options(headers: {'x-api-key': 'apikey'}) );
- Android 9及以上默认禁止明文HTTP请求,若服务器未配置HTTPS,需在
内容的提问来源于stack exchange,提问作者cwf
相关产品推荐
相关产品推荐

