"UNAVAILABLE" 从 android 客户端到 python 服务器的 gRPC 失败

"UNAVAILABLE" gRPC failure from android client to python server

当我尝试对我机器上的 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.access0(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:协议:3.0.0

我尝试过的事情:

  1. 正在降级到 grpc 1.0.0
  2. 正在降级 Android 工作室
  3. 尝试过python 2&3
  4. 从 python 客户端连接有效!

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

如有任何帮助,我们将不胜感激!

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

原来肯定和最近的gRPC/protobufpython个包有关(刚刚通过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