如何从Android模拟器访问主机网络并扫描同一网络内的设备?
Hey,这个问题我之前踩过不少坑,给你梳理清楚解决方案:
一、Android模拟器访问主机网络
不同的模拟器设置略有区别,先讲最常用的Android Studio自带模拟器:
- 访问主机的localhost服务:直接用特殊IP
10.0.2.2就行,这个是模拟器内置的映射地址,对应主机的127.0.0.1。比如主机在localhost:8080跑了个接口,模拟器里直接请求http://10.0.2.2:8080就能访问。 - 访问主机的局域网IP服务:如果你的主机在局域网里的IP是
192.168.1.100这类,默认NAT模式下模拟器可能访问不了,这时候可以把模拟器切换到桥接模式:- 打开AVD管理器,找到要设置的模拟器,点击「Edit this AVD」
- 进入「Show Advanced Settings」,找到「Network」部分
- 把「Network Mode」从默认的
NAT改成Bridge,然后选择主机当前使用的网卡(比如WiFi或以太网) - 重启模拟器,这时候模拟器会获取和主机同一网段的IP,直接用主机的局域网IP就能访问了。
如果是Genymotion模拟器,更简单:默认就是桥接模式,直接用主机的局域网IP就能访问,或者用10.0.3.2映射localhost。
二、访问主机所在的局域网网络
只要把模拟器切换到桥接模式(上面说的方法),模拟器就会成为局域网里的一个独立设备,获取和主机同一网段的IP地址,这时候就能直接访问局域网里的其他设备了——比如你局域网里的NAS、其他电脑、IoT设备,只要知道它们的IP,直接在模拟器里访问就行。
注意:如果你的主机开了防火墙,要确保允许模拟器所在的IP段访问相关端口,不然会被拦截。
三、扫描同一网络的设备
要扫描局域网内的设备,有几种方法:
1. 应用层实现(适合Android App)
你可以在Android应用里写代码扫描网段,步骤大概是:
- 先获取模拟器当前的IP和子网掩码,计算出要扫描的IP范围(比如
192.168.1.1到192.168.1.255) - 用
InetAddress.isReachable(timeout)方法逐个ping这些IP,判断是否在线 - 别忘了在AndroidManifest.xml里添加权限:
注意:Android 6.0以上还要动态申请这些权限。<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
2. 命令行工具(适合调试)
如果只是想快速扫描,可以在模拟器的shell里用工具:
- 先打开终端,输入
adb shell进入模拟器控制台 - 用
ping命令测试单个IP:ping 192.168.1.101 - 如果需要批量扫描,可以装
nmap(部分模拟器自带,没有的话需要自己安装),比如执行nmap -sn 192.168.1.0/24,就能列出网段内的在线设备。
一些注意事项
- 如果你用的是模拟器的「Cold Boot」(冷启动),可能需要重新设置网络模式,热启动有时候会保留旧的网络配置
- 部分轻量模拟器可能不支持桥接模式,这时候可以试试把主机的服务绑定到
0.0.0.0(允许所有IP访问),然后用主机的局域网IP让模拟器访问
内容的提问来源于stack exchange,提问作者Martynas Jurkus




