Retrofit调用本地IP接口连接超时 Postman正常Android端访问失败
HTTP FAILED: java.net.SocketTimeoutException: failed to connect to /192.168.1.52 (port 5000) from /192.168.1.54 (port 58978) after 60000ms: isConnected failed: ETIMEDOUT (Connection timed out)
排查与解决方案
1. 检查本地服务防火墙配置
- 部署在192.168.1.52的5000端口服务默认可能没有开放局域网访问权限,本机Postman调用不会触发防火墙拦截,但安卓设备跨设备访问会被拦截
- Windows系统操作:打开
Windows Defender防火墙→高级设置→入站规则→新建规则→端口→特定本地端口填5000→允许连接→勾选域、专用、公网(可先全勾测试,后续再按网络环境调整)→命名保存后重试 - Mac/Linux系统操作:使用ufw防火墙时执行命令
sudo ufw allow 5000;使用firewalld时执行命令sudo firewall-cmd --add-port=5000/tcp --permanent && sudo firewall-cmd --reload
2. 检查服务绑定地址
- 多数后端开发框架默认绑定
127.0.0.1,仅支持本机访问,需修改服务启动配置,绑定到0.0.0.0或者本地局域网IP192.168.1.52 - 常用框架配置示例:
- Flask:将启动代码改为
app.run(host="0.0.0.0", port=5000) - Express:将监听代码改为
app.listen(5000, "0.0.0.0")
- Flask:将启动代码改为
3. 检查安卓端配置
- 确保安卓设备/模拟器和部署服务的电脑处于同一WiFi局域网,未开启VPN、代理工具导致网段隔离
- 检查AndroidManifest.xml已配置必要的网络权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- 目标SDK≥28的应用默认禁止明文HTTP请求,需新增明文访问许可:
- 在
res/xml目录下新建network_security_config.xml文件:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">192.168.1.52</domain> </domain-config> </network-security-config>- 在AndroidManifest.xml的
<application>标签中添加属性:android:networkSecurityConfig="@xml/network_security_config"
- 在
4. 验证网络与Retrofit配置
- 先在安卓设备自带浏览器访问
http://192.168.1.52:5000/你的接口路径,如果无法返回结果,优先排查前两项配置;如果可以正常返回,说明问题出在Retrofit配置 - 确认Retrofit的BaseURL配置正确,示例:
val retrofit = Retrofit.Builder() .baseUrl("http://192.168.1.52:5000/") // 末尾保留斜杠,接口路径不需要加开头斜杠 .addConverterFactory(GsonConverterFactory.create()) .build()
内容的提问来源于stack exchange,提问作者DGAD
相关产品推荐
相关产品推荐

