如何解决Android GRPC 客户端 http 调用错误 io.grpc.StatusException: UNAVAILABLE: End of stream or IOException 值得一提:
问候,
我想知道在调用后端使用NodeJS构建并使用Repl.it部署到互联网的GRPC服务时如何解决以下异常。 以下是我在 ui 测试期间收到的消息:
io.grpc.StatusException: UNAVAILABLE: End of stream or IOException
at io.grpc.Status.asException(Status.java:550)
at io.grpc.kotlin.ClientCalls$rpcImpl$1$1$1.onClose(ClientCalls.kt:289)
at io.grpc.internal.DelayedClientCall$DelayedListener$3.run(DelayedClientCall.java:464)
at io.grpc.internal.DelayedClientCall$DelayedListener.delayOrExecute(DelayedClientCall.java:428)
at io.grpc.internal.DelayedClientCall$DelayedListener.onClose(DelayedClientCall.java:461)
at io.grpc.internal.ClientCallImpl.cloSEObserver(ClientCallImpl.java:553)
at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:68)
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:739)
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:718)
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
##上下文:## 我目前在一个 android 应用程序中工作,我尝试在后端和移动客户端中实现 GRPC 功能,在 Android 端,我已经使用 protobuf-gradle-plugin、grpc-stub、grpc 等库设置了 grpc 客户端java、grpc-kotlin 和 Android studio 中的 protobuff 插件。
提到的 gradle 插件和库已经为 proto 文件生成了客户端类,对于后端,我已经使用官方库实现了 grpc 服务,确保使用 0.0.0.0 公开该服务它在使用 nodejs 客户端连接到它时工作。
/* grpc server service setup and running */
/* ... deFinitions and proto file loading ... */
function main() {
let server = new grpc.Server();
server.addService(placesProto.PlacesService.service,{
List: placesEndpoint.List
});
server.bind('0.0.0.0:50051',grpc.ServerCredentials.createInsecure());
server.start();
console.log('grpc server running at {0.0.0.0:50051}');
}
main();
/* remote data source using the generated grpc service client*/
class DataSource {
private val channel: ManagedChannel =
ManagedChannelBuilder.forAddress(BuildConfig.GRPC_API_HOSTNAME,BuildConfig.GRPC_API_PORT)
.idleTimeout(30,TimeUnit.SECONDS).usePlaintext().build()
private val client: PlacesServiceGrpcKt.PlacesServiceCoroutinestub =
PlacesServiceGrpcKt.PlacesServiceCoroutinestub(channel)
suspend fun fetchPlaces(): Flow<AppResult<List<VisitablePlace>>> = flow {
val response: PlacesListResponse = client.list(PlacesListRequest.getDefaultInstance())
emit(when {
response.placesList.isNotEmpty() -> {
val visitablePlaces: List<VisitablePlace> =
response.placesList.mapNotNull { VisitablePlace(it) }
AppResult.Success(visitablePlaces)
}
else -> {
AppResult.Error(Exception("Places list not available."))
}
})
}
}
值得一提:
- 我将 Repl.it 用于 nodejs 后端,因为从那里开发和提供 Web 应用程序很容易,在这部分中,我已经使用 javascript 测试了该服务,想法是了解如何解决它们之间的连接,在 kotlin 代码片段中,我使用了 grpc 客户端库中提供的类:S
- 我正在使用物理设备(不是模拟器)进行测试
最好的问候,
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。