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

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模拟器,避免缓存问题:
    wsl --shutdown
    
    之后重新启动WSL2和模拟器。

内容的提问来源于stack exchange,提问作者Lance-Legrand NGANDO-DAVID

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:57:47