从 android 客户端到 python 服务器的“不可用”gRPC 失败

Posted

技术标签:

【中文标题】从 android 客户端到 python 服务器的“不可用”gRPC 失败【英文标题】:"UNAVAILABLE" gRPC failure from android client to python server 【发布时间】:2017-05-07 02:05:12 【问题描述】:

当我尝试对运行在我的机器上(在同一网络上)的 python RPC 服务器进行 RPC 调用时,我整天都在努力解决 android 上的 gRPC 的以下问题。

我的 android gRPC android 客户端编译并运行,但是,我在客户端上收到以下错误消息(并且在 python 服务器上静默):

io.grpc.StatusRuntimeException: UNAVAILABLE
Caused by: java.io.IOException: PROTOCOL_ERROR invalid settings id: -509 

完整的堆栈跟踪如下:

05-06 18:39:01.133 5018-5302/com.example.android.cimi I/SyncAdapter: Failed... : 
io.grpc.StatusRuntimeException: UNAVAILABLE
at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:227)
at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:208)
at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:141)
at com.example.android.cimi.CimiSyncerGrpc$CimiSyncerBlockingStub.getHouseholdTimestamps(CimiSyncerGrpc.java:209)
at com.example.android.cimi.SyncAdapter.onPerformSync(SyncAdapter.java:130)
at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:259)
Caused by: java.io.IOException: PROTOCOL_ERROR invalid settings id: -509
at io.grpc.okhttp.internal.framed.Http2.ioException(Http2.java:589)
at io.grpc.okhttp.internal.framed.Http2.access$200(Http2.java:47)
at io.grpc.okhttp.internal.framed.Http2$Reader.readSettings(Http2.java:304)
at io.grpc.okhttp.internal.framed.Http2$Reader.nextFrame(Http2.java:162)
at io.grpc.okhttp.OkHttpClientTransport$ClientFrameHandler.run(OkHttpClientTransport.java:868)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
05-06 18:39:01.139 5018-5018/com.example.android.cimi I/SyncService: Service destroyed                                                                         

关闭服务器时,我得到一个不同的错误,所以一定是发生了其他事情。

我正在使用以下版本: io.grpc:protoc-gen-grpc-java:1.3.0 com.google.protobuf:protoc:3.0.0

我尝试过的事情:

    降级到 grpc 1.0.0 降级 Android Studio 试过python 2&3 从 python 客户端连接有效!

我还能如何调试它?有没有办法获得更有意义的例外?有没有办法让服务器更冗长?

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

通过确认在使用 Java 服务器时调用有效,我已将其缩小到 python gRPC 服务器的问题。

原来它一定与最近的 gRPC/protobuf python 包有关(刚刚通过 pip install 安装,一定是抓取了最新的):

以下用于降级 gRPC 安装的命令序列解决了该问题:

cd /usr/lib/python2.7/site-packages
rm -rf packaging* 
rm -rf pyparsing*
pip2 install protobuf==3.0.0
pip2 install grpcio==1.0.0
pip2 install grpcio-tools==1.0.0

【讨论】:

这令人不安!请在our issue tracker 中提出问题,并尽可能详细地说明您在使用 gRPC Python 时遇到的问题。 protobuf==3.0.0, grpcio==1.0.4, grpcio-tools==1.0.4 for Python 和 1.0.3 for Java - 适合我 看起来这个问题是在这里报告的:github.com/grpc/grpc/issues/11258(请注意,与报告的相反,我在 opensuse linux 上运行 python 服务器)。

以上是关于从 android 客户端到 python 服务器的“不可用”gRPC 失败的主要内容,如果未能解决你的问题,请参考以下文章

Android客户端与Python服务器端通信之上传图片

在 python 中从服务器发送一些行到 QT(C++) 客户端

将图像从 Android(使用 Android 异步 Http 客户端)上传到 rails 服务器(使用回形针)

从 spring hibernate 服务器推送通知到 android 客户端

Android 从 Service 到 Client 的通信

Python 多线程服务器和与 Android 客户端的异步 websocket 通信