使用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的服务器端和客户端实现就完成了。

目录
相关文章
|
7月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
217 2
|
5月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
366 98
|
10月前
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
12846 33
MCP客户端调用看这一篇就够了(Java版)
|
6月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
253 0
|
8月前
|
Windows
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
240 2
|
9月前
|
Windows
Windows下版本控制器(SVN)-启动服务器端程序
Windows下版本控制器(SVN)-启动服务器端程序
353 4
|
12月前
|
Java Linux 定位技术
Minecraft配置文件参数说明(JAVA服务器篇)
Minecraft JAVA版服务器启动后会生成server.properties配置文件,位于minecraft_server/根目录下。该文件包含多项关键设置,如游戏模式(gamemode)、最大玩家数(max-players)、难度(difficulty)等。此文档详细说明了各配置项的功能与默认值,帮助用户高效管理服务器环境。
3099 60
|
10月前
|
存储 网络协议 Java
Java获取客户端IP问题:返回127.0.0.1
总结:要解决Java获取客户端IP返回127.0.0.1的问题,首先要找出原因,再采取合适的解决方案。请参考上述方案来改进代码,确保在各种网络环境下都能正确获取客户端IP地址。希望本文对您有所帮助。
634 25
|
11月前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
2445 5