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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:43:20