全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何使用gRPC实现RPC通信?(服务端与客户端示例)

C++实现gRPC通信需四步:1.定义.proto接口;2.用protoc生成C++代码;3.继承Service类实现服务端;4.通过Stub编写客户端调用,注意编译时链接gRPC和Protobuf库。

用 C++ 实现 gRPC RPC 通信,核心是定义协议(.proto)、生成 C++ 代码、实现服务端逻辑、编写客户端调用。整个流程不复杂但需注意编译依赖和运行时链接。

1. 定义 .proto 接口文件

先写一个 helloworld.proto,声明服务和消息结构:

syntax = "proto3";

package helloworld;

// 请求和响应消息 message HelloRequest { string name = 1; }

message HelloReply { string message = 1; }

// 定义 RPC 方法 service Greeter { rpc SayHello(HelloRequest) returns (HelloReply) {} }

这个文件描述了“客户端传名字,服务端回欢迎语”的简单交互。

2. 生成 C++ 代码

protoc 和 gRPC 插件生成头文件与源文件:

  • 安装 protoc 和 grpc_cpp_plugin(通常随 gRPC 源码或包管理器安装)
  • 执行命令(假设 protoc 在 PATH 中):
protoc -I . --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` helloworld.proto

会生成 helloworld.pb.h/.cc(数据序列化)和 helloworld.grpc.pb.h/.cc(服务桩)。

3. 编写服务端(Server)

继承生成的 Greeter::Service 类,重写 SayHello 方法:

#include "helloworld.grpc.pb.h"
#include 
#include 
#include 

class GreeterServiceImpl final : public helloworld::Greeter::Service { public: grpc::Status SayHello(grpc::ServerContext context, const helloworld::HelloRequest request, helloworld::HelloReply* reply) override { std::string prefix("Hello "); reply->set_message(prefix + request->name()); return grpc::Status::OK; } };

int main() { std::string server_address("0.0.0.0:50051"); GreeterServiceImpl service;

grpc::ServerBuilder builder; builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); builder.RegisterService(&service);

std::unique_ptr server(builder.BuildAndStart()); std::cout << "Server listening on " << server_address << std::endl; server->Wait(); // 阻塞等待 }

关键点:使用 InsecureServerCredentials() 表示明文通信;若需 TLS,改用 SslServerCredentials 并提供证书。

4. 编写客户端(Client)

用生成的 stub 调用远程方法:

#include "helloworld.grpc.pb.h"
#include 
#include 
#include 

int main(int argc, char** argv) { std::string target_str = "localhost:50051"; GreeterClient client( grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));

std::string user("world"); std::string reply = client.SayHello(user); std::cout << "Got reply: " << reply << std::endl; return 0; }

// 辅助类封装 stub 调用 class GreeterClient { public: explicit GreeterClient(std::sharedptr channel) : stub(helloworld::Greeter::NewStub(channel)) {}

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

helloworld::HelloReply reply;
grpc::ClientContext context;

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

if (status.ok()) {
  return reply.message();
} else {
  return "RPC failed: " + status.error_message();
}

}

private: std::uniqueptr<:greeter::stub> stub; };

注意:客户端也用 InsecureChannelCredentials() 对应服务端的不安全模式;异步调用可改用 AsyncStub

5. 编译与运行

需链接 gRPC 和 Protobuf 库(以 CMake 为例):

find_package(gRPC CONFIG REQUIRED)
find_package(Protobuf REQUIRED)

add_executable(server server.cpp helloworld.pb.cc helloworld.grpc.pb.cc) target_link_libraries(server PRIVATE grpc++ grpc++_reflection protobuf::libprotobuf)

add_executable(client client.cpp helloworld.pb.cc helloworld.grpc.pb.cc) target_link_libraries(client PRIVATE grpc++ protobuf::libprotobuf)

确保环境已安装 gRPC(推荐用 官方源码编译 或 vcpkg/conan 管理)。运行时先启动 server,再运行 client。


# go  # ssl  # ai  # c++  # ios  # stream  # red  # 继承  # 接口  # private  # 异步  # rpc  # 服务端  # 客户端  # 重写  # 为例  # 管理器  # 不安全  # 也用  # 需注意  # 先写  # 头文件 


相关文章: 建站之星安装后如何配置SEO及设计样式?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  股票网站制作软件,网上股票怎么开户?  如何快速搭建虚拟主机网站?新手必看指南  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在IIS中新建站点并配置端口与物理路径?  建站之星官网登录失败?如何快速解决?  已有域名如何快速搭建专属网站?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何快速生成ASP一键建站模板并优化安全性?  建站主机CVM配置优化、SEO策略与性能提升指南  制作网站的公司有哪些,做一个公司网站要多少钱?  如何确保FTP站点访问权限与数据传输安全?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  如何彻底删除建站之星生成的Banner?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  C++如何使用std::optional?(处理可选值)  已有域名和空间,如何快速搭建网站?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  建站之星在线版空间:自助建站+智能模板一键生成方案  电商平台网站制作流程,电商网站如何制作?  建站之星后台管理:高效配置与模板优化提升用户体验  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  网站制作需要会哪些技术,建立一个网站要花费多少?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  常州自助建站工具推荐:低成本搭建与模板选择技巧  如何高效完成自助建站业务培训?  家具网站制作软件,家具厂怎么跑业务?  如何用PHP快速搭建高效网站?分步指南  官网网站制作腾讯审核要多久,联想路由器newifi官网  教程网站设计制作软件,怎么创建自己的一个网站?  制作网站的基本流程,设计网站的软件是什么?  建站主机选购指南与交易推荐:核心配置解析  如何在西部数码注册域名并快速搭建网站?  制作网站的软件免费下载,免费制作app哪个平台好?  制作网站公司那家好,网络公司是做什么的?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  红河网站制作公司,红河事业单位身份证如何上传?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  实现虚拟支付需哪些建站技术支撑?  如何基于云服务器快速搭建网站及云盘系统?  XML的“混合内容”是什么 怎么用DTD或XSD定义  如何在Golang中使用replace替换模块_指定本地或远程路径 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。