grpc cpp简单例子

要在C++中使用Protocol Buffers (proto) 实现一个服务,通常会使用gRPC。这是一个高级的实现,涉及定义.proto文件、生成C++代码并实现服务器和客户端逻辑。

以下是一个完整的示例,包括.proto文件、C++服务器和客户端实现。

步骤 1: 安装依赖

需要安装Protocol Buffers编译器和gRPC。可以参考gRPC C++ Quick Start来安装这些依赖。

步骤 2: 定义.proto文件

创建一个名为example.proto的文件,定义服务和消息。

syntax = "proto3";

package example;

// The greeting service definition.
service Greeter {
 // Sends a greeting
 rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
 string name = 1;
}

// The response message containing the greetings.
message HelloReply {
 string message = 1;
}

步骤 3: 生成C++代码

使用protoc编译.proto文件生成C++代码。

protoc -I=. --grpc_out=. --plugin=protoc-gen-grpc=$(which grpc_cpp_plugin) example.proto
protoc -I=. --cpp_out=. example.proto

这会生成example.grpc.pb.h、example.grpc.pb.cc、example.pb.h和example.pb.cc文件。

步骤 4: 实现服务器

创建一个名为server.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::Greeter;
using example::HelloRequest;
using example::HelloReply;

// Logic and data behind the server's behavior.
class GreeterServiceImpl final : public Greeter::Service {
 Status SayHello(ServerContext* context, const HelloRequest* request,
         HelloReply* reply) override {
  std::string prefix("Hello ");
  reply->set_message(prefix + request->name());
  return Status::OK;
 }
};

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;
}

步骤 5: 实现客户端

创建一个名为client.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::Greeter;
using example::HelloRequest;
using example::HelloReply;

class GreeterClient {
public:
 GreeterClient(std::shared_ptr<Channel> channel)
   : stub_(Greeter::NewStub(channel)) {}

 std::string SayHello(const std::string& user) {
  HelloRequest request;
  request.set_name(user);

  HelloReply reply;

  ClientContext context;

  Status status = stub_->SayHello(&context, request, &reply);

  if (status.ok()) {
   return reply.message();
  } else {
   std::cout << status.error_code() << ": " << status.error_message()
        << std::endl;
   return "RPC failed";
  }
 }

private:
 std::unique_ptrGreeter::Stub stub_;
};

int main(int argc, char** argv) {
 GreeterClient greeter(grpc::CreateChannel(
   "localhost:50051", grpc::InsecureChannelCredentials()));
 std::string user("world");
 std::string reply = greeter.SayHello(user);
 std::cout << "Greeter received: " << reply << std::endl;

 return 0;
}

步骤 6: 编译和运行

首先编译服务器和客户端:

g++ -std=c++11 -o server server.cpp example.pb.cc example.grpc.pb.cc -lgrpc++ -lprotobuf -lpthread
g++ -std=c++11 -o client client.cpp example.pb.cc example.grpc.pb.cc -lgrpc++ -lprotobuf -lpthread

然后,在两个不同的终端中,分别启动服务器和客户端:

./server
./client

应该会看到客户端输出类似Greeter received: Hello world的消息。

这样,就完成了一个简单的基于gRPC和Protocol Buffers的C++服务的实现。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值