Flutter无法向WSL2中运行的Node.js服务器发送HTTP请求
问题原因分析
Flutter(Android模拟器环境下)无法访问WSL2中Node.js服务器的核心是网络隔离差异:
- Postman、Windows浏览器运行在Windows主机上,和WSL2处于同一网络环境,Windows主机可直接访问WSL2的虚拟IP,或通过端口转发访问localhost;
- Android模拟器是独立虚拟系统,其网络与WSL2虚拟网卡不直接互通,即使使用WSL的IP或10.0.2.2(模拟器指向Windows主机的地址),也可能因端口转发失效、WSL防火墙拦截、Android权限缺失等问题失败。
解决步骤
1. 补全AndroidManifest.xml配置
除了开启明文流量,必须添加互联网权限(很多人会遗漏这一步):
<!-- 在<manifest>标签下、<application>标签外添加 --> <uses-permission android:name="android.permission.INTERNET"/>
2. 关闭WSL2内部防火墙
仅关闭Windows防火墙没用,WSL2的Ubuntu防火墙可能拦截外部请求:
# 在WSL2的Ubuntu终端执行 sudo ufw disable
如果不想完全关闭防火墙,可仅开放3001端口:
sudo ufw allow 3001/tcp sudo ufw reload
3. 修复WSL2端口转发规则(适配动态IP)
WSL2每次重启后虚拟IP会变化,之前的portproxy规则会失效,用PowerShell重新配置:
# 删除旧的3001端口代理规则 netsh interface portproxy delete v4tov4 listenport=3001 listenaddress=0.0.0.0 # 获取当前WSL2的IP地址 $wslIp = wsl -d Ubuntu hostname -I | ForEach-Object { $_ -split ' ' | Select-Object -First 1 } # 添加新的端口转发规则,将Windows的3001端口转发到WSL2的3001端口 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=3001 connectaddress=$wslIp connectport=3001
4. 使用Windows主机的局域网IP访问
在Flutter代码中,替换为Windows主机的实际局域网IP(通过ipconfig查看WiFi/以太网的IPv4地址,格式如192.168.x.x):
final response = await http.get(Uri.parse('http://192.168.1.105:3001/mint'));
若端口转发规则生效,
http://10.0.2.2:3001/mint也可使用,但直接用Windows局域网IP更稳定。
5. 验证端口转发状态
执行以下命令确认规则已生效:
netsh interface portproxy show v4tov4
应能看到一条listenport=3001的规则,connectaddress为当前WSL2的IP。
额外排查点
- 确认Node.js服务器确实监听
0.0.0.0(你已完成此设置); - 重启WSL2和Flutter模拟器,避免缓存问题:
之后重新启动WSL2和模拟器。wsl --shutdown
内容的提问来源于stack exchange,提问作者Lance-Legrand NGANDO-DAVID
相关产品推荐
相关产品推荐

