首页 > 其他分享 >protoBuf 实现客户端与服务端

protoBuf 实现客户端与服务端

时间:2023-05-18 09:04:12浏览次数:28  
标签:java protoBuf grpc void io import public 服务端 客户端

转载请注明出处:

1.定义消息格式

   在 src/main/proto 目录下创建 person.proto 文件,并定义消息格式,例如:

syntax = "proto3";
package example;

message Person {
  string name = 1;
  int32 age = 2;
  repeated string interests = 3;
}

  这个文件定义了一个名为 Person 的消息类型,包括三个字段:name、age 和 interests

2.生成代码

  使用 protoc 工具来生成 Java 代码,需要安装相应的插件和工具,可以通过 Maven 或 Gradle 等构建工具自动下载和配置。这里演示手动下载和安装的方式。

  首先下载 protoc 工具及其插件,例如从官方网站下载对应版本的 protoc-3.x.x-linux-x86_64.zip,以及 protoc-gen-grpc-java 插件,例如从 Maven 中央仓库下载最新版的 protoc-gen-grpc-java-1.42.0-linux-x86_64.exe。

  然后解压 protoc 工具,将 protoc 命令所在的路径添加到环境变量 PATH 中,例如:

export PATH="/path/to/protoc/bin:$PATH"

  接下来安装 protobuf-java 和 grpc-java 两个依赖,例如通过 Maven 引入以下依赖:

<dependency>
  <groupId>com.google.protobuf</groupId>
  <artifactId>protobuf-java</artifactId>
  <version>3.17.3</version>
</dependency>

<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-netty-shaded</artifactId>
  <version>1.42.0</version>
</dependency>

<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-protobuf</artifactId>
  <version>1.42.0</version>
</dependency>

<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-stub</artifactId>
  <version>1.42.0</version>
</dependency>

<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-testing</artifactId>
  <version>1.42.0</version>
  <scope>test</scope>
</dependency>

  接着使用 protoc 生成 Java 代码,例如:

protoc --java_out=src/main/java --grpc-java_out=src/main/java src/main/proto/person.proto

  这个命令会在 src/main/java/example 目录下生成 Person.java、PersonGrpc.java 和 PersonGrpc$PersonStub.java 等文件。

3.实现服务端

package example;

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;

import java.io.IOException;

public class PersonServer {
    private final int port;
    private final Server server;

    public PersonServer(int port) throws IOException {
        this.port = port;
        this.server = ServerBuilder.forPort(port)
                .addService(new PersonServiceImpl())
                .build();
    }

    public void start() throws IOException {
        server.start();
        System.out.println("Server started, listening on " + port);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.err.println("*** shutting down gRPC server since JVM is shutting down");
            PersonServer.this.stop();
            System.err.println("*** server shut down");
        }));
    }

    public void stop() {
        if (server != null) {
            server.shutdown();
        }
    }

    private static class PersonServiceImpl extends PersonGrpc.PersonImplBase {
        @Override
        public void getMessage(PersonRequest request, StreamObserver<PersonResponse> responseObserver) {
            String name = request.getName();
            int age = request.getAge();
            String interests = String.join(", ", request.getInterestsList());
            
            // 将请求的内容响应回去
            PersonResponse response = PersonResponse.newBuilder()
                    .setMessage("Received person info: name=" + name + ", age=" + age + ", interests=[" + interests + "]")
                    .build();
            responseObserver.onNext(response);
            responseObserver.onCompleted();
        }
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        PersonServer server = new PersonServer(8989);
        server.start();
        server.blockUntilShutdown();
    }
}

  

4.实现客户端

package example;

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class PersonClient {
    private final ManagedChannel channel;
    private final PersonGrpc.PersonStub stub;

    public PersonClient(String host, int port) {
        this.channel = ManagedChannelBuilder.forAddress(host, port)
                .usePlaintext()
                .build();
        this.stub = PersonGrpc.newStub(channel);
    }

    public void shutdown() throws InterruptedException {
        channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
    }

    public void sendMessage(String name, int age, String... interests) throws InterruptedException {
        final CountDownLatch latch = new CountDownLatch(1);

        StreamObserver<PersonResponse> responseObserver = new StreamObserver<PersonResponse>() {
            @Override
            public void onNext(PersonResponse response) {
                System.out.println("Received response: " + response.getMessage());
            }

            @Override
            public void one rror(Throwable t) {
                System.err.println("Received error: " + t.getMessage());
                latch.countDown();
            }

            @Override
            public void onCompleted() {
                System.out.println("Request completed");
                latch.countDown();
            }
        };

        List<String> interestList = Arrays.asList(interests);
        PersonRequest request = PersonRequest.newBuilder()
                .setName(name)
                .setAge(age)
                .addAllInterests(interestList)
                .build();

        stub.getMessage(request, responseObserver);

        latch.await();
    }

    public static void main(String[] args) throws InterruptedException {
        PersonClient client = new PersonClient("localhost", 8989);

        // 向服务器发送请求
        client.sendMessage("Alice", 20, "reading", "swimming");

        // 关闭连接
        client.shutdown();
    }
}

  这个客户端会向服务器发送一个包含 name、age 和 interests 字段的 PersonRequest 消息,并等待接收服务器的响应信息。

 

 

标签:java,protoBuf,grpc,void,io,import,public,服务端,客户端
From: https://www.cnblogs.com/zjdxr-up/p/17410838.html

相关文章

  • GRPC与 ProtoBuf 的理解与总结
    转载请注明出处:1.GRPC官网:https://www.grpc.io/gRPC官方文档中文版:http://doc.oschina.net/grpcRPC框架的目标就是让远程服务调用更加简单、透明,其负责屏蔽底层的传输方式(TCP/UDP)、序列化方式(XML/Json)和通信细节。服务调用者可以像调用本地接口一样调用远程的......
  • Ubuntu终端(terminal)及Thunderbird邮件客户端常用的快捷键
    Ubuntu终端常用的快捷键Ubuntu中的许多操作在终端(Terminal)中十分的快捷,记住一些快捷键的操作更得心应手。在Ubuntu中打开终端的快捷键是Ctrl+Alt+T。其他的一些常用的快捷键如下:快捷键功能Tab自动补全Ctrl+a光标移动到开始位置Ctrl+e光标移动到最末尾Ctrl+k删除此处至末尾的所有......
  • springCloud Alibaba服务的注册与发现之eureka客户端注册
    1、在客户端maven项目中添加eureka客户端依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>2、在工程application.yml文件中......
  • .net core 自颁发ssl证书,及客户端证书验证
    .netcore自颁发ssl证书,及客户端证书验证openshell颁发证书:先下载openshell,下载地址:https://slproweb.com/products/Win32OpenSSL.htmlopensslgenrsa-outserver.key2048opensslx509-req-inserver.csr-outserver.crt-signkeyserver.key-days36500opensslpk......
  • Oracle客户端导出服务端数据(数据泵)生成DMP文件并导入
    1.首先了解下EXPDP和EXP的区别   1)EXP和IMP是客户端工具程序,它们既可以在可以客户端使用,也可以在服务端使用。   2)EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLEQ服务端使用,不能在客户端使用   3)IMP只适用于EXP导出文件,不适用于EXPDP导出文件......
  • OneFastClient客户端用SuperAdmin登录提示用户不存在?
    原因:服务器端没设超管密码解决办法:......
  • 一个好用的命令行mysql客户端 mycli
    官网:https://www.mycli.net/支持自动补全,高亮提示,非常好用;查看表结构\dtsys_menu;有点遗憾的是没有展示注释信息,不可也可以用其它语句查看:showfullcolumnsfromsys_menu;showcreatetablesys_menu;查询结果导出\Tcsv;\o~/export.csv;SELECT*FROMt_t......
  • Grpc MagicOnion库 之 客户端和服务端 (案例版)
    之前通过自己写动态代理和用现成的动态代理库等实现过RPC功能,今天,就写一下如何直接引用GRPC的库来实现业务逻辑。gRPC的介绍,之前我也说了这个g的含义太多,也包含谷歌的意思了。可以看这个gRPC的文档介绍:https://grpc.io/docs/what-is-grpc/MagicOnion这个库用它是因为它内部使用......
  • minio 客户端使用
       直接用Aws  python (S3 SDK)importboto3defbackup_s3(filepath,s3_bucket,s3key,s3_access_key=None,s3_secret_key=None,endpoint_url=None):s3=Noneifs3_access_keyands3_secret_key:s3=boto3.client('s3',aws_access_k......
  • OEM13.5安装推送客户端报错Executing command emctl secure agent
     OEM13.5安装推送客户端报错Executingcommandemctlsecureagent 现象: 建议部分显示如下方案:1../emctlsecureagent2../emctlstartagent3../emctlconfigagentaddinternaltargets  结合EM13c:EnterpriseManagerCloudControlAgentInstallation......