如何解决Flutter上传图片到Node.js后端的Connection refused错误
Flutter上传图片至Node.js后端报「Connection refused (OS Error: Connection refused, errno = 111)」的排查方案
错误信息
终端错误日志
> Performing hot restart... Syncing files to device sdk gphone64 x86 > 64... Restarted application in 1,691ms. D/CompatibilityChangeReporter( 9724): Compat change id reported: 78294732; UID 10162; state: DISABLED > D/MediaScannerConnection( 9724): Scanned > /data/user/0/com.example.mongo_backend/cache/2fdd677e-2569-4d9c-8349-b461215be87f8625165904540994379.jpg > to null > > ======== Exception caught by image resource service ================================================ The following SocketException was thrown resolving an image codec: Connection > refused (OS Error: Connection refused, errno = 111), address = > localhost, port = 46640 > > When the exception was thrown, this was the stack: > #0 _NativeSocket.startConnect (dart:io-patch/socket_patch.dart:682:35) > #1 _RawSocket.startConnect (dart:io-patch/socket_patch.dart:1817:26) > #2 RawSocket.startConnect (dart:io-patch/socket_patch.dart:27:23) > #3 Socket._startConnect (dart:io-patch/socket_patch.dart:2038:22) > #4 Socket.startConnect (dart:io/socket.dart:759:21) > #5 _ConnectionTarget.connect (dart:_http/http_impl.dart:2453:20)
应用端错误截图

已完成的排查操作
- 确认Node.js后端服务器正在运行并监听指定端口(本次为46640)
- 验证无防火墙规则阻止连接
问题
如何排查该「Connection refused」错误,成功实现Flutter应用到Node.js后端的图片上传?
排查与解决步骤
替换localhost为宿主机IP地址
模拟器中的localhost指向模拟器自身,而非你的电脑。Android模拟器需用10.0.2.2替代localhost;iOS模拟器若无法用localhost,则换成电脑的局域网IP。例如将请求地址从http://localhost:46640/upload改为http://10.0.2.2:46640/upload(Android)或http://你的电脑IP:46640/upload。调整Node.js服务器监听地址
确保后端服务器监听所有网络地址而非仅localhost,修改启动代码:// 错误写法:仅监听本地 app.listen(46640, 'localhost', () => { console.log('Server running') }) // 正确写法:监听所有外部请求 app.listen(46640, '0.0.0.0', () => { console.log('Server running') }) // 或省略地址参数,默认监听0.0.0.0 app.listen(46640, () => { console.log('Server running') })验证模拟器与后端的连通性
在模拟器内置浏览器中访问http://10.0.2.2:46640(Android)或电脑IP+端口,若无法打开,说明后端配置仍有问题;若能正常访问,检查Flutter代码中的请求地址是否拼写错误。核对请求路径与方法
确认Flutter上传代码的接口路径、请求方法(需为POST)与后端路由完全一致,比如后端路由是/upload,Flutter中不能写成/uploads。检查Android网络权限
确保Flutter项目的android/app/src/main/AndroidManifest.xml中添加了网络权限:<uses-permission android:name="android.permission.INTERNET" />关闭代理或VPN
若当前开启了代理或VPN,暂时关闭,避免干扰模拟器与电脑之间的网络连接。
内容的提问来源于stack exchange,提问作者pomoworko.com
相关产品推荐
相关产品推荐

