要在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++服务的实现。