gRPC Android客户端失去连接“太多ping”

时间:2018-12-20 09:56:58

标签: android grpc keep-alive grpc-java

Android grpc客户端从服务器收到GOAWAY消息,并显示“太多ping”错误。现在,我意识到这可能是服务器端的问题,但是我认为问题在于客户端通道设置与服务器的设置不匹配。

我有一个具有以下设置的C#gRPC服务器:

List<ChannelOption> channelOptions = new List<ChannelOption>();
channelOptions.Add(new 
ChannelOption("GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS", 
1000));
channelOptions.Add(new 
ChannelOption("GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA", 0));
channelOptions.Add(new 
ChannelOption("GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS", 1));


this.server = new Server(channelOptions) {
    Services = { TerminalService.BindService(this) },
    Ports = {new ServerPort("0.0.0.0", 5000, 
 ServerCredentials.Insecure)}
};

在Android上,我具有以下频道设置:

private val channel = ManagedChannelBuilder.forAddress(name, port)
        .usePlaintext()
        .keepAliveTime(10, TimeUnit.SECONDS)
        .keepAliveWithoutCalls(true)
        .build()

几分钟后(不过似乎是随机时间)。我收到错误消息。我注意到,如果我在通话中流传输数据,则该错误永远不会发生。仅当流上没有数据时。这使我相信问题在于,还需要在Android客户端上设置GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA。问题是我一生,我找不到在gRPC java上设置这些通道设置的位置。有人可以指出我在哪里可以设置这些频道设置吗?没有设置这些示例的示例。

1 个答案:

答案 0 :(得分:0)

指定的通道选项使用了错误的名称。像"grpc.http2.max_pings_without_data"之类的C定义就是GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA之类的名称。

您可以通过查看grpc_types.h将C名称映射到键字符串。您应该更喜欢在ChannelOptions中使用C#常量之一,但是在这种情况下似乎不是一种选择。

这些选项在Java ManagedChannelBuilder API中不可见,因为它们是服务器特定的设置。因此,它们在ServerBuilder上可见。有关Java Keepalive API的参考,请参见A8 client-side keepalive