4

我正在尝试在提供者和消费者进程之间建立一个与平台无关的通信渠道。发现 grpc + protobuf 是一个不错的选择。

是否有在 Android 上运行的 GRPC 服务器(Java/C++)的示例或实现?我正在按照 grpc java 服务器示例来实现服务器 i

private class GrpcServerTask extends AsyncTask<Void, Void, String>{

    @Override
    protected void onPreExecute() {
    }
    @Override
    protected String doInBackground(Void... params) {
        int port = 50051;
        Server server;
        try {
            server = ServerBuilder.forPort(port)
                    .addService(new GreeterImpl())
                    .build()
                    .start();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

private class GreeterImpl extends GreeterGrpc.GreeterImplBase {

    @Override
    public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
        HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
        responseObserver.onNext(reply);
        responseObserver.onCompleted();
    }
}

我不断收到错误

io.grpc.ManagedChannelProvider$ProviderNotFoundException: No functional server found. Try adding a dependency on the grpc-netty artifact
on executing new GrpcServerTask().execute();

谢谢

4

1 回答 1

1

Android 上的 Netty 服务器并不真正受支持。Android 的垃圾收集器和 NIO 支持都太差,无法获得良好的 Netty 性能。还有一些事情不太可能奏效,比如 TLS。如果它只是为了在最新的 Android 版本上进行测试,它可能大部分都可以工作,但不能保证它现在可以工作或将来继续工作。

考虑到这一点,请确保您依赖于 grpc-netty 并尝试不使用 ProGuard 作为测试。ProGuard 的重命名和剥离都会引起麻烦;你需要-keepnames io.grpc.ServerProvider并且-keep io.grpc.netty.NettyServerProvider在你的 ProGuard 规则中,就像对 client-side 所做的那样

C++ 在另一个选项中。客户端已在 Android 上使用,如果您让客户端工作,我希望服务器端能够正常工作。但我也不太了解 C++ 实现。

于 2016-09-07T01:58:06.933 回答