使用java从零开始手写gprc服务器端和客户端程序

简介: proto grpc

GRPC是一个现代的开源高性能RPC框架,能够实现基于RPC协议的远程调用,使用的数据协议是Protocol Buffers。下面开始准备手写入门级别的服务器端和客户端程序。需要准备Windows版本的protoc命令行工具,可以去网上自行找一下,本人使用protoc-3.17.3-win64,包含protoc.exe和protoc-gen-grpc-java-1.31.1-windows-x86_64.exe,这两个命令行工具用来基于proto文件生成调用代码,下面准备一个简单的proto文件。

syntax = "proto3";
packagetest.hello;
serviceHelloGrpcService {
rpcquery(HelloGrpcRequest) returns (HelloGrpcResponse){};
}
messageHelloGrpcRequest {
stringname = 1;
}
messageHelloGrpcResponse {
stringresult = 1;
}

Protocol Buffers规范可以去官网学习,里面都是一些约定俗成的定义,主要规范参数类型,响应类型和调用方法,支持基本数据类型,类和集合等所有常用的数据类型。下面将上述proto文件,命名为HelloGrpc.proto,放在跟protoc.exe和protoc-gen-grpc-java-1.31.1-windows-x86_64.exe一样的目录下,protoc.exe和protoc-gen-grpc-java-1.31.1-windows-x86_64.exe也要放在同一个目录下,方便操作。然后在该目录下执行以下命令

protoc.exe --plugin=protoc-gen-grpc-java=protoc-gen-grpc-java-1.31.1-windows-x86_64.exe HelloGrpc.proto --java_out=./ --grpc-java_out=./

这样就会在当前目录下创建test/hello,并且再hello目录下会生成HelloGrpc.java和HelloGrpcServiceGrpc.java两个类,都是与GRPC框架和Proto协议相关的模板代码,里面包含了我们在proto文件里定义的方法和参数之类的。下面将HelloGrpc.java和HelloGrpcServiceGrpc.java拷贝到我们的项目目录中,开始编写服务器端和客户端代码,服务器端代码如下:

packagecom.proto.server;
importio.grpc.stub.StreamObserver;
importtest.hello.HelloGrpc;
importtest.hello.HelloGrpcServiceGrpc;
publicclassHelloGrpcServiceImplextendsHelloGrpcServiceGrpc.HelloGrpcServiceImplBase {
@Overridepublicvoidquery(HelloGrpc.HelloGrpcRequestrequest, StreamObserver<HelloGrpc.HelloGrpcResponse>responseObserver) {
Stringname=request.getName();
HelloGrpc.HelloGrpcResponse.Builderbuilder=HelloGrpc.HelloGrpcResponse.newBuilder();
builder.setResult("Welcome "+name);
HelloGrpc.HelloGrpcResponseresponse=builder.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
    }
}
packagecom.proto.server;
importio.grpc.Server;
importio.grpc.ServerBuilder;
importjava.io.IOException;
publicclassHelloGrpcServer {
publicstaticvoidmain(String[] args) throwsIOException, InterruptedException {
Serverserver=ServerBuilder.forPort(50056).addService(newHelloGrpcServiceImpl()).build().start();
System.out.println("server started..........");
if(server!=null){
server.awaitTermination();
        }
    }
}

然后就是客户端调用代码:

packagecom.proto.client;
importio.grpc.ManagedChannel;
importio.grpc.ManagedChannelBuilder;
importtest.hello.HelloGrpc;
importtest.hello.HelloGrpcServiceGrpc;
importjava.io.IOException;
publicclassHelloGrpcClient {
publicstaticvoidmain(String[] args) throwsIOException {
// 设置 RPC 引擎为 ProtobufRpcEngineStringhostname="localhost";
intport=50056;
HelloGrpc.HelloGrpcRequest.Builderbuilder=HelloGrpc.HelloGrpcRequest.newBuilder();
builder.setName("anisbob");
ManagedChannelchannel=ManagedChannelBuilder.forAddress(hostname,port)
                .usePlaintext()
                .build();
HelloGrpcServiceGrpc.HelloGrpcServiceBlockingStubblockingStub=HelloGrpcServiceGrpc.newBlockingStub(channel);
HelloGrpc.HelloGrpcResponseresponse=blockingStub.query(builder.build());
System.out.println(response.getResult());
    }
}

首先启动HelloGrpcServer,然后再启动HelloGrpcClient就可以看到client控制台输出Welcome anisbob。到此一个入门级别的五脏俱全的grpc的服务器端和客户端实现就完成了。

目录
相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
68 9
|
7天前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
68 14
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
26天前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
38 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
1月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
64 1
|
21天前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
36 0
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
47 4
|
2月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
126 2
|
2月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
151 1
|
2月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
66 1
|
2月前
|
安全 区块链 数据库