c++中grpc简单使用---函数介绍及其代码演示

前言

C++ gRPC(Google Remote Procedure Call)是一种高性能、开源的远程过程调用框架,用于在不同服务之间进行通信。
配置gRPC可以访问该网站:grpc配置

一.函数介绍

下面是一些常见的 C++ gRPC 函数及其功能:

  1. grpc::Channel:表示一个 gRPC 通道,客户端通过这个通道与服务端进行通信。

  2. grpc::CreateChannel(const std::string& target, grpc::ChannelArguments channel_args =grpc::ChannelArguments()):创建一个 gRPC 通道。target 是服务端地址,例如 “localhost:50051”。channel_args 是可选的通道参数,例如超时时间、压缩方式等。

  3. grpc::ChannelArguments:表示 gRPC 通道的参数,例如超时时间、压缩方式等。

  4. grpc::ClientContext:表示一个 gRPC 客户端上下文,用于存储请求和响应的相关信息。

  5. grpc::Status:表示 gRPC 请求的状态,包括请求是否成功、错误代码和错误信息等。

  6. grpc::StubOptions:表示 gRPC 存根选项,用于配置 gRPC 存根的行为。

  7. grpc::ServerBuilder:表示 gRPC 服务器构建器,用于配置 gRPC 服务器。

  8. grpc::Server:表示一个 gRPC 服务器,用于处理客户端请求。

  9. grpc::ServerContext:表示一个 gRPC 服务器上下文,用于存储请求和响应的相关信息。

  10. grpc::Service:表示一个 gRPC 服务,包含一组接口和方法,用于处理客户端请求。

  11. grpc::ServerBuilder::AddListeningPort(const std::string& addr, grpc::ServerBuilder::Protocol protocol = grpc::ServerBuilder::Protocol::HTTP):添加一个监听端口。addr 是监听地址,例如 “localhost:50051”。protocol 是可选的协议,默认为 HTTP。

  12. grpc::ServerBuilder::RegisterService(const grpc::Service* service):注册一个 gRPC 服务。

  13. grpc::ServerBuilder::BuildAndStart():构建并启动 gRPC 服务器。

  14. grpc::ServerBuilder::Shutdown():关闭 gRPC 服务器。

  15. grpc::ServerBuilder::WaitForShutdown():等待 gRPC 服务器关闭。

  16. grpc::ServerBuilder::cq():返回 gRPC 服务器的 completion queue(完成队列),用于处理异步请求。

二.代码演示

api.proto


syntax = "proto3";
option java_multiple_files = true;
option java_package = "io.grpc.examples.routeguide";
option java_outer_classname = "RouteGuideProto";
option objc_class_prefix = "RTG";package routeguide;service Route {rpc Echo(RestRequest) returns (stream RestResponse) {}
}// Response
message RestResponse {// The location from which the message is sent.int32 code = 1;string message = 2;string body = 3;
}
message RestRequest {string url = 1;string body = 2;
}

server.cc

#include <grpc/grpc.h>
#include <string>
#include "../grpc/api.grpc.pb.h"#include <grpcpp/security/server_credentials.h>
#include <grpcpp/server_builder.h>
#include <grpcpp/server_context.h>
#include <iostream>
#include <dlfcn.h>
#include<iostream>
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::ServerReader;
using grpc::ServerReaderWriter;
using grpc::ServerWriter;
using grpc::Status;
using routeguide::Route;
using std::chrono::system_clock;
using routeguide::RestResponse;
using routeguide::RestRequest;
using std::string;
using std::wstring;
class RouteGuideImpl final : public routeguide::Route::Service{public:explicit RouteGuideImpl(){}Status Echo(ServerContext*context ,const RestRequest*request,ServerWriter<RestResponse>*write)override{std::cout<<"32"<<std::endl;request->GetMetadata();

//进行数据处理///std::cout<<"client message::  "<<request->body()<<std::endl;RestResponse response;response.set_code(1);response.set_message("sadfgh");response.set_body("sadfgh");write->Write(response);return Status::OK;}
};
//我们通过使用ServerBuilder去构建和启动服务器
void RunServer(){std::string server_address("127.0.0.1:5000");//std::string server_address("0.0.0.0:5000");//创建我们的服务实现类 RouteGuideImpl 的一个实例RouteGuideImpl service;std::cout<<"46"<<std::endl;//创建工厂类 ServerBuilder 的一个实例。ServerBuilder builder;std::cout<<"50"<<std::endl;//在生成器的 AddListeningPort() 方法中指定客户端请求时监听的地址和端口。builder.AddListeningPort(server_address,grpc::InsecureServerCredentials());//用生成器注册我们的服务实现。std::cout<<"54"<<std::endl;builder.RegisterService(&service);std::cout<<"61"<<std::endl;//调用生成器的 BuildAndStart() 方法为我们的服务创建和启动一个RPC服务器。    std::unique_ptr<Server>server(builder.BuildAndStart());调用服务器的 Wait() 方法实现阻塞等待,直到进程被杀死或者 Shutdown() 被调用std::cout<<"server listen on"<<server_address<<std::endl;server->Wait();}int main(){RunServer();}

client.cc

#include"grpc/api.grpc.pb.h"
#include<grpc++/grpc++.h>
#include<iostream>
#include<string>
#include<unistd.h>
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;using routeguide::RestResponse;
using routeguide::RestRequest;
using routeguide::Route;
class StringReverseClient{public:StringReverseClient(std::shared_ptr<grpc::Channel>channel):stub_(Route::NewStub(channel)){}void fun(){RestRequest req;req.set_body("body");req.set_url("message");RestResponse reply;ClientContext context;std::unique_ptr< ::grpc::ClientReader< ::routeguide::RestResponse>> reader = stub_->Echo(&context, req);// 循环读取 reader 中的数据,并将其存入 reply 中while (reader->Read(&reply)){// 打印 reply 中的 message 字段std::cout << "message:" << reply.message() << std::endl;}// 获取 reader 中的状态码Status status = reader->Finish();// 如果状态码为 ok(),则提示成功获取 grpc 响应,并打印响应消息if (status.ok()) {//AlertMessage("Get grpc response success,the messsage is:" +reply.message());std::cout << "Rpc Request success!:"  << std::endl;} else {// 如果状态码不为 ok(),则提示失败获取 grpc 响应,并打印状态码和错误消息//AlertMessage("Get grpc response failed!:" +std::to_string(status.error_code())+":"+ status.error_message());std::cout << "Rpc Request failed!:"  << std::endl;std::cout << status.error_code() << ": " << status.error_message()<< std::endl;}}private:std::unique_ptr<Route::Stub>stub_;
};
void RunClient(){std::string target_address("127.0.0.1:5000");StringReverseClient client(grpc::CreateChannel(target_address,grpc::InsecureChannelCredentials()));client.fun();
}
int main(){RunClient();// 等待2秒sleep(2);return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.11)
project(hello_grpc)set(Protobuf_USE_STATIC_LIBS ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
# cmake-format: off
# ubuntu通过apt包管理器安装的grpc没有findgrpc.cmake这样的文件,但是有.pc这样的文件
# windows通过vcpkg库管理器安装的grpc有gRPCConfig.cmake,但是没有.pc文件
# 。。无语,大无语。。
# Linux上用PkgConfig获取库;windows上直接通过find_package查找;
# cmake-format: on
find_package(PkgConfig REQUIRED)
find_package(Protobuf REQUIRED)
if(WIN32)find_package(GRPC REQUIRED)get_target_property(GRPC_CPP_PLUGIN gRPC::grpc_cpp_plugin LOCATION)set(GRPC_LIBRARIES gRPC::grpc++) # 这样也可以,nb
else()find_program(GRPC_CPP_PLUGIN grpc_cpp_plugin REQUIRED)pkg_check_modules(GRPC REQUIRED grpc++)
endif()# Proto file
set(calcu_proto "${CMAKE_SOURCE_DIR}/api.proto")
get_filename_component(calcu_proto_path "${calcu_proto}" PATH)set(calcu_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/api.pb.cc")
set(calcu_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/api.pb.h")
set(calcu_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/api.grpc.pb.cc")
set(calcu_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/api.grpc.pb.h")# 不要使用execute_process(),它在配置的时候调用
# 使用add_custom_command(),当有target使用OUTPUT中的输出时,将调用这个命令重新生成
add_custom_command(OUTPUT "${calcu_proto_srcs}" "${calcu_proto_hdrs}" "${calcu_grpc_srcs}""${calcu_grpc_hdrs}"COMMAND${Protobuf_PROTOC_EXECUTABLE} ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"--cpp_out "${CMAKE_CURRENT_BINARY_DIR}" -I "${calcu_proto_path}"--plugin=protoc-gen-grpc="${GRPC_CPP_PLUGIN}" "${calcu_proto}"DEPENDS "${calcu_proto}")# Include generated *.pb.h files
include_directories("${CMAKE_CURRENT_BINARY_DIR}")add_library(calcu_grpc_proto ${calcu_proto_srcs} ${calcu_proto_hdrs}${calcu_grpc_srcs} ${calcu_grpc_hdrs})target_link_libraries(calcu_grpc_proto ${GRPC_LIBRARIES} ${Protobuf_LIBRARIES})foreach(_target server client)add_executable(${_target} "${CMAKE_SOURCE_DIR}/${_target}.cc")target_link_libraries(${_target} calcu_grpc_proto ${GRPC_LIBRARIES}${Protobuf_LIBRARIES})
endforeach()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos的YUM源

可以使用以下几个常见的YUM源&#xff0c;这些源通常具有较快的速度和较高的可用性&#xff1a; 阿里云 (Aliyun) [aliyun] nameAliyun mirrors baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG…

使用Spring Boot与Spire.Doc实现Word文档的多样化操作

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 使用Spring Boot与Spire.Doc实现Word文档的多样化操作具有以下优势&#xff1a; 强大的功能组合&#xff1a;Spring Boot提供了快速构建独立和生产级的Spring应用程序的能力&#xff0c;而Spire.Doc则…

【Golang 面试 - 进阶题】每日 3 题(二)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

【Docker】搭建实用的内网穿透工具 - FRP

前言 本教程基于群晖的NAS设备DS423+的docker功能进行搭建FRP的客户端,DSM版本为 7.2.1-69057 Update 5。采用香港机Debian 12系统的服务器来安装FRP的服务端作为演示。 服务器购买地址:https://www.crash.work/aff/AQXGDNKY 简介 FRP(Fast Reverse Proxy)是一个高性能…

OSError: You are trying to access a gated repo.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

『 Linux 』用户态与内核态的转换机制及信号检测时机

文章目录 用户态与内核态进程地址空间操作系统的本质 信号的处理时机 用户态与内核态 进程在执行代码的过程中代码必定涉及用户代码,库函数代码及操作系统内核代码; 以简单的printf()函数为例,该函数必定为先执行用户的代码即知道需要调用printf()函数,再执行库(如libc)中的代码…

这六种灯千万别买了!看你踩了几个坑

雅静说啥样的灯买了才发现是个坑      给你说6个,安上就会后悔的      1,这些变色的灯就别要了,说的是三色温灯,买回家才发现      它的白光,暖光,中性光,我们习惯只用一种,开,关,开,关,开5次      才能调到自己想要的档位,不想患上关节炎就别买这种了     …

Java线程同步与通信:wait(), notify(), notifyAll(), sleep()

Java线程同步与通信&#xff1a;wait&#xff08;&#xff09;, notify&#xff08;&#xff09;, notifyAll&#xff08;&#xff09;, sleep&#xff08;&#xff09; 1. wait()2. notify()3. notifyAll()4. sleep()4、总结 &#x1f496;The Begin&#x1f496;点点关注&…

一文带你读懂TCP

文章目录 1 TCP协议1.1 TCP 基础1.1.1 TCP 特性1.2.2 TCP连接数 1.2 TCP 头1.2.1 TCP 头格式1.2.2 MTU&#xff0c;MSS&#xff0c;分片传输 1.3 TCP 连接三路握手1.4 TCP 断开四次挥手1.5 SYN攻击和防范1.6 重传机制1.6.1 超时重传1.6.2 快速重传1.6.3 SACK 1.7 滑动窗口1.8 流…

微信小程序根据动态权限展示tabbar

微信小程序自定义 TabBar 后根据权限动态展示tabbar 在微信小程序开发中,自定义 TabBar 可以让应用更具灵活性和个性化。特别是在用户根据不同权限展示不同的 TabBar 内容时,正确的实现方法能够提升用户体验。本篇文章将分享如何使用事件总线实现权限变动时动态更新自定义 T…

软件环境安装-通过Docker安装rabbitmq

软件环境安装-通过Docker安装rabbitmq 一、拉取镜像二、启动三、安装延迟队列插件 一、拉取镜像 docker pull rabbitmq:3.9.0-management二、启动 docker run -d --namerabbitmq --restartalways -p 5672:5672 -p 15672:15672 rabbitmq:3.9.0-management 三、安装延迟队列插…

Linux基础复习(二)

前言 本文介绍了一下Linux命令行基本操作及网络配置 一、 命令行提示含义 [当前用户主机名 工作目录]$ 若当前用户是root&#xff0c;则最后一个字符为# 否则&#xff0c;最后一个字符为$ 二、常用Linux命令及其解释 修改主机名 一般在创建一台主机后会使用hostname相关命…

在生信分析中大家需要特别注意的事情​

在生信分析中大家需要特别注意的事情 标准的软件使用和数据分析流程 1. 先看我的b站教学视频 2. 先从我的百度网盘把演示数据集下载下来&#xff0c;先把要运行的模块的演示数据集先运行一遍 3. 前两步都做完了&#xff0c;演示数据集也运行成功了&#xff0c;并且知道了软件…

服务器构建私有npm库(Docker + Verdaccio)

npm官网有时候因为网络原因包推不上去&#xff0c;那就简单构建个私有库 私有库不会被共享&#xff0c;且配置不需要太高1h2G就行 1.需要安装Docker&#xff0c;这个跳过了 2.生成配置文件 mkdir /home/verdaccio cd /home/verdaccio mkdir conf && mkdir storage &am…

ajax请求成功但不执行success-function回调函数

目录 一、问题分析 二、处理问题 一、问题分析 在测试员工管理系统的登录和注册代码时&#xff0c;登录一切正常&#xff0c;就是注册成功后没有跳转页面&#xff0c;后面发现是success-function回调函数没有正常执行。原因主要是前端和后端交流的数据格式不一致&#xff0c;…

【C++BFS算法 二分查找】2812. 找出最安全路径

本文涉及知识点 CBFS算法 C二分查找 LeetCode2812. 找出最安全路径 给你一个下标从 0 开始、大小为 n x n 的二维矩阵 grid &#xff0c;其中 (r, c) 表示&#xff1a; 如果 grid[r][c] 1 &#xff0c;则表示一个存在小偷的单元格 如果 grid[r][c] 0 &#xff0c;则表示一…

Windows配置AirSim过程(学习过程)

一、概述 因为需要在虚幻引擎当中使用AirSim&#xff0c;在Windows系统上进行操作&#xff0c;根据官方网站的操作过程&#xff0c;进行了配置&#xff0c;这里作为自己配置过程的记录。 二、具体过程 &#xff08;一&#xff09;系统版本 操作系统是Windows11&#xff0c;Ai…

go编译执行文件

1、如果进行单个文件编译go build xxx.go 2、批文件编译 不实际编译它&#xff0c;只输出它的编译过程&#xff1a; 1 go build -n 简单的编译过程分析&#xff1a; 上面的过程确认了两个事情&#xff1a; Runtime会永远随着用户代码一起编译在windows平台上编译出来了一…

昇思MindSpore 应用学习-RNN实现情感分类-CSDN

RNN实现情感分类 AI代码解析 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入…

HALCON如何创建本地函数

HALCON中有本地函数(.hdev)、外部函数(HDevelop函数文件.hdvp)和库函数(.hdpl) 本地函数(.hdev)&#xff1a;创建后仅在当前程序文件中使用&#xff1b; 外部函数(HDevelop函数文件.hdvp)&#xff1a;创建后可以在其他程序文件中复用&#xff0c;默认保存在…/ procedures/下…