Android Retrofit仅模拟器可连本地服务器,真机连接失败求助
解决Android真机无法连接本地服务器的问题
我来帮你排查下这个问题,模拟器能正常请求但真机不行,通常是网络环境或者权限配置的问题,咱们一步步来:
1. 确认设备处于同一局域网
- 首先要确保你的Android真机和搭建服务器的电脑连接的是同一个Wi-Fi网络(别一个连Wi-Fi一个连有线,或者分属不同子网)。
- 再仔细核对本机IP:用电脑的
ipconfig(Windows)或ifconfig(Mac/Linux)查看当前Wi-Fi网卡的IP,绝对不能用本地回环地址127.0.0.1,也别搞错成以太网的IP。
2. 检查电脑防火墙设置
- Windows系统:打开「Windows Defender防火墙」,找到「允许应用通过防火墙」,确保你的服务器程序(比如Tomcat、Node服务等)已经被允许在专用和公用网络中通行;也可以临时关闭防火墙测试,要是能连上了,再去配置规则放行服务器端口。
- Mac/Linux:同样检查系统防火墙,确保服务器监听的端口(比如8080、3000这类)已经对外开放。
3. 验证端口是否能被真机访问
- 直接在真机的浏览器里输入
http://你的电脑IP:服务器端口测试,比如http://192.168.1.100:8080。如果浏览器也打不开,那说明和Retrofit无关,是网络或服务器端口开放的问题。 - 如果浏览器能打开但Retrofit不行,再往下看配置问题。
4. 完善AndroidManifest配置
- 先确认你已经添加了必要的网络权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 针对Android 9及以上版本(API 28+),系统默认禁止明文HTTP请求,如果你的服务器用的是HTTP而非HTTPS,必须在
<application>标签里添加android:usesCleartextTraffic="true":<application ... android:usesCleartextTraffic="true"> ... </application>
5. 核对Retrofit的BaseUrl配置
- 确保BaseUrl是真机能访问的正确地址,比如:
别用val retrofit = Retrofit.Builder() .baseUrl("http://192.168.1.100:8080/") // 末尾记得加斜杠 .addConverterFactory(GsonConverterFactory.create()) .build()localhost或者10.0.2.2(这个是模拟器访问本机的特殊地址,真机完全不适用)。
6. 其他可能的坑
- 有些路由器有「AP隔离」功能,开启后同一Wi-Fi下的设备不能互相访问,去路由器后台看看有没有开这个功能,有的话关掉试试。
- 检查服务器监听地址:如果服务器只绑定了
127.0.0.1,那只有本机能访问,其他设备连不上。比如Node.js服务要确保监听0.0.0.0,而不是默认的localhost。
按照上面的步骤排查,应该能解决大部分问题啦。
内容的提问来源于stack exchange,提问作者user7128116




