使用 c++ 写一个protobuf前后端通讯程序
时间: 2023-08-19 11:58:58 浏览: 261
基于C++实现使用protobuf完成网络通信源码.zip
当然可以!下面是一个使用C++编写的简单的Protobuf前后端通信程序的示例:
1. 首先,你需要安装Protobuf并编写一个`.proto`文件来定义你的消息格式。假设我们的`.proto`文件名为`message.proto`,并且定义了一个名为`Message`的消息类型,包含一个字符串字段`content`。
```protobuf
syntax = "proto3";
message Message {
string content = 1;
}
```
2. 使用`protoc`命令编译`.proto`文件生成对应的C++代码。
```bash
$ protoc message.proto --cpp_out=.
```
这将生成`message.pb.h`和`message.pb.cc`文件。
3. 创建一个服务器端程序,用于接收客户端发送的消息并进行处理。
```cpp
#include <iostream>
#include <string>
#include <grpcpp/grpcpp.h>
#include "message.pb.h"
#include "message.grpc.pb.h"
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using message::Message;
using message::MessageRequest;
using message::MessageResponse;
using message::MessageService;
class MessageServiceImpl final : public MessageService::Service {
Status SendMessage(ServerContext* context, const MessageRequest* request, MessageResponse* response) override {
const std::string& content = request->message().content();
std::cout << "Received message: " << content << std::endl;
// 在这里可以对消息进行处理
response->set_status("Message received successfully");
return Status::OK;
}
};
void RunServer() {
std::string server_address("0.0.0.0:50051");
MessageServiceImpl 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() {
RunServer();
return 0;
}
```
4. 创建一个客户端程序,用于向服务器发送消息。
```cpp
#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "message.pb.h"
#include "message.grpc.pb.h"
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using message::Message;
using message::MessageRequest;
using message::MessageResponse;
using message::MessageService;
class MessageClient {
public:
MessageClient(std::shared_ptr<Channel> channel)
: stub_(MessageService::NewStub(channel)) {}
std::string SendMessage(const std::string& content) {
Message message;
message.set_content(content);
MessageRequest request;
request.set_allocated_message(&message);
MessageResponse response;
ClientContext context;
Status status = stub_->SendMessage(&context, request, &response);
if (status.ok()) {
return response.status();
} else {
return "RPC failed";
}
}
private:
std::unique_ptr<MessageService::Stub> stub_;
};
int main() {
std::string server_address("localhost:50051");
MessageClient client(grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()));
std::string content;
std::cout << "Enter message content: ";
std::getline(std::cin, content);
std::string status = client.SendMessage(content);
std::cout << "Server response: " << status << std::endl;
return 0;
}
```
这个示例程序演示了一个简单的客户端向服务器发送消息,并在服务器端打印接收到的消息。你可以根据自己的需求修改和扩展这个示例代码来实现更复杂的通信逻辑。记得在编译时链接Protobuf和gRPC库。
希望这个示例对你有帮助!如果还有其他问题,请随时提问。
阅读全文