Android端gRPC请求抛出UNAVAILABLE异常,连接超时求助
排查步骤与解决方案
1. 确认网络权限配置
Android 23+需同时在Manifest声明权限,并动态申请网络权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Android 10及以上需检查应用设置里的网络访问权限是否开启,后台线程发起请求时,避免被系统限制网络。
2. 处理明文流量限制(Android 9+)
若服务端未配置SSL/TLS,需允许明文流量:
- 直接在
AndroidManifest.xml的application标签添加:
android:usesCleartextTraffic="true"
- 或创建
res/xml/network_security_config.xml,仅允许指定IP的明文流量:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">192.168.1.35</domain> </domain-config> </network-security-config>
再在Manifest的application标签引用:
android:networkSecurityConfig="@xml/network_security_config"
3. 修正服务端监听地址
确保服务端gRPC服务监听0.0.0.0而非127.0.0.1,后者仅允许本地访问。以Java服务端为例:
Server server = ServerBuilder.forPort(8445) .addService(new YourServiceImpl()) .build() .start();
默认监听0.0.0.0,若手动指定127.0.0.1需修改。
4. 验证局域网连通性
- 在Android设备上执行
ping 192.168.1.35,若不通,检查设备是否在同一WiFi网络,路由器是否开启AP隔离(部分路由器默认开启,会阻止设备间通信)。 - 用
telnet 192.168.1.35 8445测试端口,若无法连接,说明服务端未正常监听端口,或存在端口冲突。
5. 确保异步执行gRPC请求
Android禁止主线程发起网络请求,需在子线程执行,示例:
CoroutineScope(Dispatchers.IO).launch { val channel = ManagedChannelBuilder.forAddress("192.168.1.35", 8445) .usePlaintext() .build() val stub = YourServiceGrpc.newBlockingStub(channel) try { val response = stub.yourRpcMethod(YourRequest.newBuilder().build()) // 处理响应 } catch (e: StatusRuntimeException) { // 处理异常 } finally { channel.shutdown() } }
6. 对齐gRPC版本
确保服务端与客户端的gRPC版本一致,避免版本不兼容导致连接失败。
附加检查项
- 关闭笔记本杀毒软件,部分软件会拦截局域网端口通信。
- 更换Android设备测试,排除设备本身网络问题。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

