C++ gRPC如何将嵌入消息ServerInfo从服务端发送至客户端
gRPC C++ 嵌套消息返回实现方案
针对你定义的包含嵌套ServerInfo消息的proto结构,服务端有两种常用的赋值方式将数据写入HelloReply返回:
方式1:直接通过mutable指针操作嵌套字段(推荐,无需额外构造临时对象)
protobuf为message类型的字段生成mutable_字段名方法,返回嵌套消息的可写指针,直接操作该指针赋值即可,示例代码如下:#include "sample.grpc.pb.h" #include <grpcpp/grpcpp.h> using grpc::ServerContext; using grpc::Status; using sample::HelloReply; using sample::HelloRequest; using sample::Sample; using sample::ServerInfo; class SampleServiceImpl final : public Sample::Service { Status Hello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override { // 直接获取sinfo字段的可写指针 ServerInfo* server_info = reply->mutable_sinfo(); // 给ServerInfo的字段赋值 server_info->set_name("业务测试服务"); server_info->set_os("CentOS 7.9"); return Status::OK; } };方式2:先独立构造ServerInfo对象,再赋值给响应
如果你已经提前构造好了ServerInfo实例,可以直接赋值给mutable指针指向的对象,示例代码如下:Status Hello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override { // 提前构造并赋值ServerInfo ServerInfo info; info.set_name("业务测试服务"); info.set_os("CentOS 7.9"); // 赋值给HelloReply的sinfo字段 *reply->mutable_sinfo() = info; return Status::OK; }
客户端读取嵌套字段的方法
客户端收到响应后,通过字段名()方法获取嵌套消息的只读引用即可读取内部字段:
// 客户端调用示例 HelloRequest req; req.set_name("测试调用端"); HelloReply rep; grpc::ClientContext ctx; std::unique_ptr<Sample::Stub> stub = Sample::NewStub(grpc::CreateChannel("127.0.0.1:50051", grpc::InsecureChannelCredentials())); Status status = stub->Hello(&ctx, req, &rep); if (status.ok()) { std::cout << "服务端名称:" << rep.sinfo().name() << std::endl; std::cout << "服务端操作系统:" << rep.sinfo().os() << std::endl; }
核心说明
protobuf针对message类型的字段不会生成基础类型那样的set_字段名方法,而是生成两类方法:
- 写操作:
mutable_字段名()返回嵌套消息的可写指针 - 读操作:
字段名()返回嵌套消息的只读常量引用
内容的提问来源于stack exchange,提问作者Prasanna
相关产品推荐
相关产品推荐

