快速入门

本指南通过一个简单的运行示例,帮助您开始在 Android Java 中使用 gRPC。

快速入门

本指南通过一个简单的运行示例,帮助您开始在 Android Java 中使用 gRPC。

先决条件

  • JDK 版本 11 或更高。

    1. 该示例使用 AGP 7.x(与 Java 11-17 兼容)。如果您将其升级到 AGP 8.x,则需要 Java 17+。
  • Android SDK,API 级别 16 或更高

    1. 安装 Android Studio 或 Android 命令行工具

    2. 通过设置以下环境变量,让其他工具和脚本知道您的 Android SDK 所在位置

      export ANDROID_SDK_ROOT="<path-to-your-android-sdk>"
      
  • 已设置为 USB 调试 的 Android 设备或 Android 虚拟设备

  • 在您的 gradle.properties 中添加以下行以确保与 Android 工具和库的兼容性:android.useAndroidX=true

获取示例代码

示例代码是 grpc-java 仓库的一部分。

  1. 将仓库下载为 zip 文件 并解压,或克隆仓库

    git clone -b v1.73.0 https://github.com/grpc/grpc-java
    
  2. 切换到 examples 目录

    cd grpc-java/examples
    

运行示例

  1. 编译服务器

    ./gradlew installDist
    
  2. 运行服务器

    ./build/install/examples/bin/hello-world-server
    INFO: Server started, listening on 50051
    
  3. 从另一个终端,构建客户端并将其安装到您的设备上

    (cd android/helloworld; ../../gradlew installDebug)
    
  4. 从您的设备启动客户端应用。

  5. 在客户端应用中,输入服务器的主机端口信息。您输入的值取决于设备类型(真实或虚拟)——有关详细信息,请参阅下面的连接到服务器

  6. 消息框中输入“Alice”并点击发送。您将看到以下响应

    Hello Alice
    

恭喜!您刚刚运行了一个使用 gRPC 的客户端-服务器应用程序。

更新 gRPC 服务

在本节中,您将通过添加一个额外的服务器方法来更新应用程序。gRPC 服务使用协议缓冲区定义。要了解如何在 .proto 文件中定义服务的更多信息,请参阅基础教程。目前,您只需要知道服务器和客户端存根都有一个 SayHello() RPC 方法,该方法接受客户端的 HelloRequest 参数并返回服务器的 HelloReply,并且该方法的定义如下

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

进行以下更改

  1. 打开 src/main/proto/helloworld.proto 并添加一个新的 SayHelloAgain() 方法,其请求和响应类型与 SayHello() 相同

    // The greeting service definition.
    service Greeter {
      // Sends a greeting
      rpc SayHello (HelloRequest) returns (HelloReply) {}
      // Sends another greeting
      rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
    }
    
    // The request message containing the user's name.
    message HelloRequest {
      string name = 1;
    }
    
    // The response message containing the greetings
    message HelloReply {
      string message = 1;
    }
    
  2. android/helloworld/app/src/main/proto/helloworld.proto 进行相同的更改。

记得保存文件!

更新应用程序

当您构建示例时,构建过程会重新生成 GreeterGrpc.java,其中包含生成的 gRPC 客户端和服务器类。这还会重新生成用于填充、序列化和检索我们的请求和响应类型的类。

但是,您仍然需要在示例应用程序的手写部分中实现和调用新方法。

更新服务器

按照 Java 快速入门页面中更新服务器部分的说明操作。

更新客户端

请按照以下步骤操作

  1. android/helloworld/app/src/main/java/io/grpc/helloworldexample 文件夹中打开 HelloworldActivity.java

  2. 找到包含 sayHello() 调用的方法。您将看到以下代码行

    HelloReply reply = stub.sayHello(request);
    return reply.getMessage();
    
  3. return 语句表达式中添加对 sayHelloAgain() 的调用,如下所示

    return reply.getMessage() + "\n" + stub.sayHelloAgain(request).getMessage();
    

运行更新后的应用程序

像之前一样运行客户端和服务器。在 examples 目录下执行以下命令:

  1. 编译服务器

    ./gradlew installDist
    
  2. 运行服务器

    ./build/install/examples/bin/hello-world-server
    INFO: Server started, listening on 50051
    
  3. 从另一个终端,构建客户端并将其安装到您的设备上

    (cd android/helloworld; ../../gradlew installDebug)
    
  4. 从您的设备启动客户端应用。

  5. 在客户端应用中,输入服务器的主机端口信息。您输入的值取决于设备类型(真实或虚拟)——有关详细信息,请参阅下面的连接到服务器

  6. 消息框中输入“Alice”并点击发送。您将看到以下响应

    Hello Alice
    Hello again Alice
    

连接到服务器

从虚拟设备连接

在您的 Android 虚拟设备上运行 Hello World 应用,并使用以下值

  • 主机10.0.2.2
  • 端口: 50051

从物理设备连接

要在物理设备上通过 USB 调试运行应用,您必须使用 adb 命令配置 USB 端口转发,如下所示

adb reverse tcp:8080 tcp:50051

这将设置从设备上的端口 8080 到连接计算机上端口 50051 的端口转发,50051 是 Hello World 服务器正在侦听的端口。

在应用中,使用以下值

  • 主机localhost
  • 端口: 8080

接下来