grpc: 使用idea创建google grpc服务端和客户端demo程序

1.创建maven项目,并在pom.xml中增加相关依赖,完整pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.edu.tju</groupId>
    <artifactId>grpc-hello</artifactId>
    <version>1.0.0</version>

    <properties>
        <grpc-version>1.15.0</grpc-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-core</artifactId>
            <version>${grpc-version}</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty-shaded</artifactId>
            <version>${grpc-version}</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>${grpc-version}</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>${grpc-version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.下载protobuf编译器(protoc.exe)和grpc插件(protoc-gen-grpc-java-1.15.0-windows-x86_64.exe),并在同一目录新建hello.proto文件,

syntax = "proto3";

option java_multiple_files = true;
option java_package = "cn.edu.tju";
option java_outer_classname = "HelloProto";

package hello;

service MyGreeter{
rpc GetHello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest{
string language=1;
string name=2;
}

message HelloResponse{
string language=1;
string name=2;
}

运行命令行程序并切换到上述目录,分别执行两个命令,

protoc hello.proto --plugin=protoc-gen-grpc-java=protoc-gen-grpc-java-1.15.0-windows-x86_64.exe --grpc-java_out=.
protoc hello.proto --java_out=.  

3.将生成的文件拷贝到idea的java目录.
4.创建服务端启动类和客户端启动类:

package cn.edu.tju;

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;


public class MyHelloServer {
    private static final Logger logger = Logger.getLogger(MyHelloServer.class.getName());

    private Server server;

    private void start() throws IOException {
        int port = 50052;
        server = ServerBuilder.forPort(port)
                .addService(new MyGreeterImpl())
                .build()
                .start();
        logger.info("服务器启动,监听端口:" + port);
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                System.err.println("正在关闭grpc服务......");
                try {
                    MyHelloServer.this.stop();
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());
                }
                System.err.println("服务器已关闭");
            }
        });
    }

    private void stop() throws InterruptedException {
        if (server != null) {
            server.shutdown().awaitTermination(30, TimeUnit.SECONDS);
        }
    }


    private void blockUntilShutdown() throws InterruptedException {
        if (server != null) {
            server.awaitTermination();
        }
    }


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

    static class MyGreeterImpl extends MyGreeterGrpc.MyGreeterImplBase {

        @Override
        public void getHello(HelloRequest req, StreamObserver<HelloResponse> responseObserver) {
            String language=req.getLanguage();
            HelloResponse reply=null;
            if(language.equals("1")){
                reply = HelloResponse.newBuilder().setName("Hello, " + req.getName()).build();
            }else{
                reply = HelloResponse.newBuilder().setName("您好, " + req.getName()).build();
            }
            responseObserver.onNext(reply);
            responseObserver.onCompleted();
        }
    }
}

package cn.edu.tju;



import io.grpc.Channel;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.StatusRuntimeException;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;


public class MyHelloClient {
    private static final Logger logger = Logger.getLogger(MyHelloClient.class.getName());

    private final MyGreeterGrpc.MyGreeterBlockingStub blockingStub;

    public MyHelloClient(Channel channel) {
        blockingStub = MyGreeterGrpc.newBlockingStub(channel);
    }


    public void greet(String name,String language) {
        logger.info("Will try to greet " + name + " by language "+language+" ...");
        HelloRequest request = HelloRequest.newBuilder().setName(name).setLanguage(language).build();
        HelloResponse response;
        try {
            response = blockingStub.getHello(request);
        } catch (Exception ex) {
            logger.info(ex.getMessage());
            return;
        }
        logger.info("来自服务器的响应: " + response.getName());
    }


    public static void main(String[] args) throws Exception {
        String user = "爱因斯坦";
        String language="2";
        String target = "localhost:50052";


        ManagedChannel channel = ManagedChannelBuilder.forTarget(target)
                .usePlaintext()
                .build();
        try {
            MyHelloClient client = new MyHelloClient(channel);
            client.greet(user,language);
        }catch (Exception ex){
            System.out.println(ex.getMessage());
        }
        finally {
            channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
        }
    }
}

目录结构如下:
在这里插入图片描述
5.先后运行服务端程序和客户端程序,可以看到服务端和客户端分别输出如下:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用CMake利用gRPC库生成一个通信案例(包含服务端客户端)的步骤: 1. 安装gRPC库 首先需要在本地安装gRPC库,可以参考官方文档进行安装。 2. 创建CMake项目 使用CMake创建一个新的项目,并在项目中添加以下内容: a. CMakeLists.txt文件 在项目根目录下创建一个CMakeLists.txt文件,内容如下: ```cmake cmake_minimum_required(VERSION 3.10) project(grpc_example) set(CMAKE_CXX_STANDARD 11) # Find gRPC find_package(gRPC REQUIRED) # Find Protobuf find_package(Protobuf REQUIRED) # Include generated *.pb.h files include_directories(${CMAKE_CURRENT_BINARY_DIR}) # Generate *.pb.cc and *.pb.h files protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS proto/example.proto ) # Define server source files set(SERVER_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/server.cpp ${PROTO_SRCS} ) # Define client source files set(CLIENT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/client.cpp ${PROTO_SRCS} ) # Define server executable add_executable(server ${SERVER_SOURCES}) target_link_libraries(server gRPC::grpc++ gRPC::grpc++_reflection protobuf::libprotobuf) # Define client executable add_executable(client ${CLIENT_SOURCES}) target_link_libraries(client gRPC::grpc++ gRPC::grpc++_reflection protobuf::libprotobuf) ``` b. example.proto文件 在项目的proto目录下创建一个example.proto文件,内容如下: ```protobuf syntax = "proto3"; package example; // Define request message message Request { string message = 1; } // Define response message message Response { string message = 1; } // Define service service ExampleService { rpc SendMessage(Request) returns (Response) {} } ``` c. server.cpp文件和client.cpp文件 在项目的src目录下分别创建一个server.cpp文件和client.cpp文件,内容如下: server.cpp: ```cpp #include <iostream> #include <memory> #include <string> #include <grpcpp/grpcpp.h> #include "example.grpc.pb.h" using grpc::Server; using grpc::ServerBuilder; using grpc::ServerContext; using grpc::Status; using example::Request; using example::Response; using example::ExampleService; // Server implementation class ExampleServiceImpl final : public ExampleService::Service { public: Status SendMessage(ServerContext* context, const Request* request, Response* response) override { std::string message = "Server received: " + request->message(); std::cout << message << std::endl; response->set_message(message); return Status::OK; } }; // Main function int main() { std::string server_address("0.0.0.0:50051"); ExampleServiceImpl service; // Build server ServerBuilder builder; builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); builder.RegisterService(&service); std::unique_ptr<Server> server(builder.BuildAndStart()); std::cout << "Server listening on " << server_address << std::endl; // Wait for server to shutdown server->Wait(); return 0; } ``` client.cpp: ```cpp #include <iostream> #include <memory> #include <string> #include <grpcpp/grpcpp.h> #include "example.grpc.pb.h" using grpc::Channel; using grpc::ClientContext; using grpc::Status; using example::Request; using example::Response; using example::ExampleService; // Client implementation class ExampleClient { public: ExampleClient(std::shared_ptr<Channel> channel) : stub_(ExampleService::NewStub(channel)) {} std::string SendMessage(const std::string& message) { Request request; request.set_message(message); Response response; ClientContext context; // Call server Status status = stub_->SendMessage(&context, request, &response); if (status.ok()) { return response.message(); } else { return "RPC failed"; } } private: std::unique_ptr<ExampleService::Stub> stub_; }; // Main function int main() { std::string server_address("0.0.0.0:50051"); // Create client ExampleClient client(grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials())); // Call server method std::string response = client.SendMessage("Hello from client!"); std::cout << "Server responded with: " << response << std::endl; return 0; } ``` 3. 构建项目 在项目根目录下执行以下命令构建项目: ```bash mkdir build cd build cmake .. make ``` 4. 运行项目 在build目录下执行以下命令启动服务端: ```bash ./server ``` 在另一个终端窗口下执行以下命令运行客户端: ```bash ./client ``` 客户端将会向服务端发送一条消息,并在控制台上输出服务端的回复消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值