Visual Studio 2022 C++ gRPC 环境搭建

文章目录

      • 1、gRPC 安装
      • 2、创建项目
        • 2.1、创建 “空的解决方案”
        • 2.2、新建 gRPCServer 和 gRPCClient 项目
        • 2.3、创建 `proto` 文件
      • 2、为 gRPC 服务端和客服端项目配置 protobuf 编译
        • 2.1、protobuf 配置
        • 2.2、gRPCServer 项目配置
        • 2.3、gRPCClient 项目配置
      • 3、测试
        • 3.1、启动服务端程序
        • 3.2、启动客户端程序

1、gRPC 安装

本文使用 vcpkg 安装 gRPC,首先确保 Windows 系统中已经安装了 vcpkg。

在 vcpkg 安装路径下启动 cmd 终端,并输入如下安装命令:

 .\vcpkg.exe install grpc:x64-windows

经过一段时间的安装后,执行如下命令,将 vcpkg 集成到 Visual Studio 中:

 .\vcpkg.exe integrate install

2、创建项目

本文介绍的是 C++ gRPC 测试环境搭建流程,为了使用方便,服务器程序和客户端程序都放在一个解决方案中,这和实际项目程序组织形式有所不同。首先创建一个空解决方案,然后添加服务器项目和客户端项目。具体流程可以参考下文描述:

2.1、创建 “空的解决方案”

打开 Visual Studio 2022,选中 C++ 空项目

在这里插入图片描述

输入项目名称,创建新的项目:

在这里插入图片描述

生成的新项目解决方案如下图所示:
在这里插入图片描述

右键选中 “gRPCDemo” ,选择 “移除”:

在这里插入图片描述

至此,生成了 “空的解决方案”,如下图所示。
在这里插入图片描述

2.2、新建 gRPCServer 和 gRPCClient 项目

右键选中 “解决方案 ‘gRPCDemo’(0 个项目)",选中 "添加”,再选中 “新建项目(N)…”:
在这里插入图片描述

选择 “控制台应用”,分别创建服务端项目和客户端项目。
在这里插入图片描述

至此,服务端项目 gRPCServer 和客服端项目 gRPCClient 已经创建成功,如下图所示:
在这里插入图片描述

其中,gRPCServer 服务端程序如下:

#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "greet.grpc.pb.h" // 自动生成的头文件

using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using greet::Greeter;
using greet::HelloRequest;
using greet::HelloReply;

// 实现 Greeter 服务接口
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;
}

其中,**gRPCClient ** 客户端程序如下:

#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "greet.grpc.pb.h" // 自动生成的头文件

using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using greet::Greeter;
using greet::HelloRequest;
using greet::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;
        // 发起 RPC 调用
        Status status = stub_->SayHello(&context, request, &reply);
        // 处理 RPC 调用的状态
        if (status.ok()) {
            return reply.message();
        } else {
            std::cout << status.error_code() << ": " << status.error_message()
                << std::endl;
            return "RPC failed";
        }
    }

private:
    std::unique_ptr<Greeter::Stub> stub_;
};

int main(int argc, char** argv) {
    // 创建到服务器的连接通道 (使用不安全的连接)
    std::string target_str = "localhost:50051";
    GreeterClient greeter(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));
    // 发送请求
    std::string user("world");
    std::string reply = greeter.SayHello(user);
    std::cout << "Greeter received: " << reply << std::endl;
    std::cout << "Finished" << std::endl;
    return 0;
}
2.3、创建 proto 文件

右键选中 解决方案 ‘gRPCDemo’ ,选中 添加,选中 新建解决方案文件夹(D),命名为 “Protos” ,操作步骤如下图所示:
在这里插入图片描述

添加 proto 文件,右键选中 “Protos 文件夹”,选中 添加(D),选中 新建项(W)…
在这里插入图片描述

选择 “文本文件”,命名为: greet.proto :
在这里插入图片描述

其中,greet.proto 文件内容为:

syntax = "proto3";

option csharp_namespace = "GrpcExample";

package greet;

// 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;
}

2、为 gRPC 服务端和客服端项目配置 protobuf 编译

2.1、protobuf 配置

右键选中 gRPCServer 项目,添加 现有项

在这里插入图片描述

选中 greet.proto 文件,将 greet.proto 文件添加到 gRPCServer 项目中:

在这里插入图片描述

2.2、gRPCServer 项目配置

下面以 gRPCServer 项目配置流程为例,介绍具体的配置过程,gRPCClientgRPCServer 作同样的配置处理。

1、右键选中 gRPCServer 项目,选中属性 --> 常规 --> C++语言标准,选为 std:c++17 及以上

在这里插入图片描述

2、右键选中 greet.proto 文件,选中 属性,修改 常规 --> 项类型 的内容为: Protobuf Compile
在这里插入图片描述

右键选中 gRPCServer 项目,点击 生成

在这里插入图片描述

成功生成项目信息:

在这里插入图片描述

2.3、gRPCClient 项目配置

gRPCClientgRPCServer 作同样的配置处理。流程参考 2.2 gRPCServer 项目配置

3、测试

3.1、启动服务端程序

在这里插入图片描述

F5 启动服务端程序,成功启动输出如下信息:

在这里插入图片描述

3.2、启动客户端程序

首先点击右侧 解决方案资源管理器,右键选中 gRPCClient 项目,点击 调试 --> 启动新实例(S)

在这里插入图片描述

客户端成功获取 gRPC 调用结果信息:

在这里插入图片描述

案例代码:https://download.csdn.net/download/Harrytsz/90220274

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Wasm是什么

WebAssembly 是什么&#xff1f; 1.1 WebAssembly 的定义 WebAssembly&#xff08;简称 Wasm&#xff09;是一种二进制指令格式&#xff0c;设计用于在现代 Web 浏览器中高效运行程序。它可以被认为是一种低级的、接近硬件的编程语言&#xff0c;是一种介于字节码和机器码之间…

使用深度学习来实现图像超分辨率 综述!

今天给大家介绍一篇图像超分辨率邻域的综述&#xff0c;这篇综述总结了图像超分辨率领域的几方面&#xff1a;problem settings、数据集、performance metrics、SR方法、特定领域应用以结构组件形式&#xff0c;同时&#xff0c;总结超分方法的优点与限制。讨论了存在的问题和挑…

直播预告|StarRocks 3.4,打造 AI 时代的智能数据基座,应用场景全面扩展

随着新年的到来&#xff0c;StarRocks 3.4 即将上线&#xff0c;为 AI Workload 和更多应用场景提供强大支持&#xff01;此次升级聚焦于提升 AI 场景支持&#xff0c;并扩展更多应用场景&#xff0c;全方位提升数据分析体验。 更强的 AI 场景支持&#xff1a; 引入 Vector In…

【GOOD】A Survey of Deep Graph Learning under Distribution Shifts

深度图学习在分布偏移下的综述&#xff1a;从图的分布外泛化到自适应 Northwestern University, USA Repository Abstract 图上的分布变化——训练和使用图机器学习模型之间的数据分布差异——在现实世界中普遍存在&#xff0c;并且通常不可避免。这些变化可能会严重恶化模…

【微服务】5、服务保护 Sentinel

Sentinel学习内容概述 Sentinel简介与结构 Sentinel是Spring Cloud Alibaba的组件&#xff0c;由阿里巴巴开源&#xff0c;用于服务流量控制和保护。其内部核心库&#xff08;客户端&#xff09;包含限流、熔断等功能&#xff0c;微服务引入该库后只需配置规则。规则配置方式有…

神经网络的进展与挫折

神经网络的概念可追溯到上世纪40年代,当时被认为是一种模拟大脑神经元网络的计算系统。 1940年代,麦卡洛克(McCulloch)和沃尔特皮茨(Walter Pitts)率先提出了受人类大脑和生物神经网络启发的人工神经网络。 1951年,马文明斯基(Marvin Minsky)的SNARC系统标志着第一个…

搭建企业AI助理的创新应用与案例分析

在大健康零售行业&#xff0c;企业面临着日益增长的市场需求和复杂的供应链管理挑战。AI助理的应用不仅能够提升客户服务效率&#xff0c;还能优化供应链管理&#xff0c;降低运营成本。 一、AI助理在大健康零售行业的创新应用 个性化健康咨询 AI助理可以通过分析客户的健康…

一文读懂「LoRA」:大型语言模型的低秩适应

LoRA: Low-Rank Adaptation of Large Language Models 前言 LoRA作为大模型的微调框架十分实用&#xff0c;在LoRA出现以前本人都是通过手动修改参数、优化器或者层数来“炼丹”的&#xff0c;具有极大的盲目性&#xff0c;但是LoRA技术能够快速微调参数&#xff0c;如果LoRA…

接口项目操作图-thinkphp6-rabbitmq

一、用户开户流程 用户首次需要联系商务开通账户&#xff0c;需要提供手机号及来访问的IP。开好户之后&#xff0c;平台方将提供用户访问的key值及header头部参数的公钥加密文件、body访问参数以及返回数据的公私钥加解密文件。 二、用户请求流程 用户将拿到的key值进行rsa公钥…

程序环境及预处理

一.程序的翻译环境和执行环境 在ANSI C&#xff08;标准c&#xff09;的任何一种实现中&#xff0c;存在两个不同的环境。 计算机是能够执行二进制指令的&#xff0c;但是我们写出的c语言代码是文本信息&#xff0c;计算机不能直接理解 第1种是翻译环境&#xff0c;在这个环境…

回顾 Tableau 2024 亮点功能,助力 2025 数据分析新突破

2024 年&#xff0c;Tableau 用更智能、更高效的工具&#xff0c;重新定义了数据分析的可能性。 回顾 2024 年&#xff0c;Tableau 凭借一系列创新功能&#xff0c;在数据可视化与分析领域再次引领潮流。无论是深度整合 AI 技术&#xff0c;还是优化用户体验的细节&#xff0c;…

【姿态估计实战】使用OpenCV和Mediapipe构建锻炼跟踪器【附完整源码与详细说明】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

快速上手Python,制作趣味猜数字游戏

在编程学习的旅程中&#xff0c;游戏是一个极佳的切入点。今天&#xff0c;我们将一起创建一个简单而有趣的猜数字游戏&#xff0c;借此机会深入学习Python编程的基础知识和一些实用的编程技巧。无论你是初学者还是有一定基础的开发者&#xff0c;相信你都能从中获得乐趣和收获…

AI驱动的可演化架构与前端开发效率

1. 引言 在当今快节奏的数字时代&#xff0c;软件系统需要具备强大的适应能力才能在瞬息万变的市场需求中保持竞争力。软件可演化架构的重要性日益凸显&#xff0c;它能够让软件系统在面对需求变更、技术升级以及市场波动时&#xff0c;能够快速、高效地进行调整和升级&#x…

用豆包MarsCode IDE打造精美数据大屏:从零开始的指南

原标题&#xff1a;用豆包MarsCode IDE&#xff0c;从0到1画出精美数据大屏&#xff01; 豆包MarsCode IDE 是一个云端 AI IDE 平台&#xff0c;通过内置的 AI 编程助手&#xff0c;开箱即用的开发环境&#xff0c;可以帮助开发者更专注于各类项目的开发。 作为一名前端开发工…

基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS

产品设计初衷 HS-P2-2D是一款针对大车盲区开发的360度全景影像 安全行车辅助系统&#xff0c;通过车身四周安装的超广角像机&#xff0c;经算法合成全景鸟瞰图&#xff0c;通过鸟瞰图&#xff0c;司机非常清楚的看清楚车辆四周情况&#xff0c;大大降低盲区引发的交通事故。 产…

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 #窗口尺寸 import random import p…

c++ 两线交点计算程序(Program for Point of Intersection of Two Lines)

给定对应于线 AB 的点 A 和 B 以及对应于线 PQ 的点 P 和 Q&#xff0c;找到这些线的交点。这些点在 2D 平面中给出&#xff0c;并带有其 X 和 Y 坐标。示例&#xff1a; 输入&#xff1a;A (1, 1), B (4, 4) C (1, 8), D (2, 4) 输出&#xff1a;给定直线 AB 和…

Taro+react 开发第一节创建 带有redux状态管理的项目

Taro 项目基于 node&#xff0c;请确保已具备较新的 node 环境&#xff08;>16.20.0&#xff09;&#xff0c;推荐使用 node 版本管理工具 nvm 来管理 node&#xff0c;这样不仅可以很方便地切换 node 版本&#xff0c;而且全局安装时候也不用加 sudo 了。 1.安装 npm inf…

2024AAAI SCTNet论文阅读笔记

文章目录 SCTNet: Single-Branch CNN with Transformer Semantic Information for Real-Time Segmentation摘要背景创新点方法Conv-Former Block卷积注意力机制前馈网络FFN 语义信息对齐模块主干特征对齐共享解码头对齐 总体架构backbone解码器头 对齐损失 实验SOTA效果对比Cit…