以下是一个简单的 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;
}