C++ gRPC helloworld 示例代码

发布时间:2024年01月02日

以下是一个简单的 C++ gRPC 示例代码,它包含了服务端和客户端的实现。这个例子以简单的问候服务为例,通过 gRPC 客户端和服务器端互相发送问候消息。

服务接口定义

首先,我们需要定义服务接口。在这个例子中,我们定义了一个 Greeter 服务,它只包含了一个简单的 SayHello 方法。

syntax = "proto3";

package helloworld;

// 定义问候服务
service Greeter {
  // 定义问候方法
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 定义问候请求消息
message HelloRequest {
  string name = 1;
}

// 定义问候回复消息
message HelloReply {
  string message = 1;
}

服务端实现

下面是一个简单的服务端实现,在此实现中,我们使用了 gRPC 的 ServerBuilder 和 ServerContext 类来创建服务器,并将实现的 Greeter 服务添加到服务器中。当客户端调用 SayHello 方法时,服务器将接收 HelloRequest 消息,并返回一个包含问候信息的 HelloReply 消息。

#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "helloworld.grpc.pb.h"

using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using helloworld::Greeter;
using helloworld::HelloRequest;
using helloworld::HelloReply;

// 定义问候服务的实现类
class GreeterServiceImpl final : public Greeter::Service {
  Status SayHello(ServerContext* context, const HelloRequest* request,
                  HelloReply* reply) override {
    // 获取客户端发送的问候消息
    std::string name = request->name();
    std::cout << "Receive greeting from " << name << std::endl;

    // 组装服务器返回的问候消息
    std::string message = "Hello " + name + ", welcome to gRPC!";
    reply->set_message(message);

    return Status::OK;
  }
};

// 启动 gRPC 服务器
void RunServer() {
  std::string server_address("0.0.0.0:50051");
  GreeterServiceImpl service;

  // 创建服务器构造器
  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;

  // 阻塞等待终止信号
  server->Wait();
}

// 主函数
int main(int argc, char** argv) {
  RunServer();
  return 0;
}
文章来源:https://blog.csdn.net/qingzhuyuxian/article/details/135338488
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。