Android模拟器连接本地Node.js服务器(localhost:2000)失败求助
解决Android模拟器连接本地Node.js服务器的问题
1. 修正Node.js服务器的监听地址
默认情况下,Node.js服务器如果只监听localhost(即server.listen(2000)),只会接受本机发起的请求,模拟器无法访问。必须让服务器监听所有网卡:
// Node.js代码示例 const express = require('express'); const app = express(); // 关键:监听0.0.0.0而不是默认的localhost app.listen(2000, '0.0.0.0', () => { console.log('服务器运行在http://0.0.0.0:2000'); });
2. 模拟器访问宿主机的正确地址
- Android模拟器内置的
10.0.2.2是宿主机localhost的映射地址,只要服务器监听0.0.0.0,直接用这个地址即可,无需修改模拟器代理。 - 如果想用笔记本的IP地址,确保:
- 模拟器和笔记本处于同一Wi-Fi/局域网
- 笔记本的防火墙允许2000端口的入站请求
3. 关闭模拟器的代理设置
你提到设置代理后提示“无效代理”,这是因为模拟器访问宿主机不需要代理。进入模拟器的设置 > 网络和互联网 > 代理,选择“无”或“不使用代理”,避免代理干扰连接。
4. 检查Dart请求的参数格式
如果你的Node.js服务器使用express.json()中间件解析JSON请求体,当前代码的body: pData会以x-www-form-urlencoded格式发送,服务器无法解析。需要修改请求:
import 'dart:convert'; import 'package:http/http.dart' as http; class Http { static String url = "http://10.0.2.2:2000/api/"; static postProduct(Map pData) async { try { final response = await http.post( Uri.parse("${url}add_product"), body: jsonEncode(pData), // 编码为JSON格式 headers: {'Content-Type': 'application/json'}, // 指定请求头类型 ); if (response.statusCode == 200) { var data = jsonDecode(response.body.toString()); print(data); } else { print('请求失败,状态码:${response.statusCode}'); } } catch (e) { print('请求异常:${e.toString()}'); } } }
5. 排查防火墙和端口占用
- 检查笔记本防火墙是否允许Node.js程序访问2000端口,可临时关闭防火墙测试连接。
- 确认2000端口未被其他程序占用,执行命令查看端口占用:
# Windows系统 netstat -ano | findstr :2000 # macOS/Linux系统 lsof -i :2000
内容的提问来源于stack exchange,提问作者Achievers Tv
相关产品推荐
相关产品推荐

