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

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防火墙,执行以下命令排查:

    1. 查看当前防火墙状态:
      sudo ufw status
      
    2. 若文件上传接口使用的端口(如3000)未放行,执行命令开放:
      sudo ufw allow 3000/tcp
      
    3. 额外注意:你的服务器是Strato云主机,需在Strato后台控制台检查云服务商层面的防火墙规则,确保对应端口已放行,这是容易忽略的关键环节。
  • 验证服务端接口的可用性
    在本地终端用curl直接测试服务器的文件上传接口,示例:

    curl -X POST -F "file=@本地测试文件路径" -F "x-api-key=apikey" http://h1013496.stratoserver.net:3000/upload
    

    若curl也返回连接拒绝,说明服务端确实存在端口未监听或防火墙拦截问题;若curl能正常响应,再排查客户端代码细节。

  • 客户端代码补充检查

    1. Android 9及以上默认禁止明文HTTP请求,若服务器未配置HTTPS,需在AndroidManifest.xml的<application>标签中添加:
      android:usesCleartextTraffic="true"
      
      你Socket.IO能正常通信大概率已配置,但可再确认。
    2. 确保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'})
      );
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:52:31