微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android GRPC 客户端 http 调用错误 io.grpc.StatusException: UNAVAILABLE: End of stream or IOException 值得一提:

如何解决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 举报,一经查实,本站将立刻删除。