Visual Studio 2022 C++ gRPC 环境搭建

文章目录

      • [1、gRPC 安装](#1、gRPC 安装)
      • 2、创建项目
        • [2.1、创建 "空的解决方案"](#2.1、创建 “空的解决方案”)
        • [2.2、新建 gRPCServer 和 gRPCClient 项目](#2.2、新建 gRPCServer 和 gRPCClient 项目)
        • [2.3、创建 `proto` 文件](#2.3、创建 proto 文件)
      • [2、为 gRPC 服务端和客服端项目配置 protobuf 编译](#2、为 gRPC 服务端和客服端项目配置 protobuf 编译)
        • [2.1、protobuf 配置](#2.1、protobuf 配置)
        • [2.2、gRPCServer 项目配置](#2.2、gRPCServer 项目配置)
        • [2.3、gRPCClient 项目配置](#2.3、gRPCClient 项目配置)
      • 3、测试

1、gRPC 安装

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

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

bash 复制代码
 .\vcpkg.exe install grpc:x64-windows

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

bash 复制代码
 .\vcpkg.exe integrate install

2、创建项目

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

2.1、创建 "空的解决方案"

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

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

生成的新项目解决方案如下图所示:

右键选中 "gRPCDemo " ,选择 "移除":

至此,生成了 "空的解决方案",如下图所示。

2.2、新建 gRPCServer 和 gRPCClient 项目

右键选中 "解决方案 'gRPCDemo'(0 个项目) ",选中 "添加 ",再选中 "新建项目(N)... ":

选择 "控制台应用 ",分别创建服务端项目和客户端项目。

至此,服务端项目 gRPCServer 和客服端项目 gRPCClient 已经创建成功,如下图所示:

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

c++ 复制代码
#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 ** 客户端程序如下:

c++ 复制代码
#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 文件内容为:

protobuf 复制代码
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

相关推荐
九州~空城1 小时前
C++中map和set的封装
java·前端·c++
Wind哥2 小时前
VS2022引入sqlite数据库交互
数据库·c++·sqlite
qystca2 小时前
数据结构(1~10)
数据结构·c++·算法
凌云行者2 小时前
C++中的常见关键字
c++·关键字
jie188945758664 小时前
c++ ---STL介绍
开发语言·c++
Nuttx_Fan_now5 小时前
比QT更高效的一款开源嵌入式图形工具EGT-Ensemble Graphics Toolkit
linux·c++·qt·开源·gui·microchip·egt
读书札记20225 小时前
visual studio 安全模式
visual studio·安全模式
飞yu流星6 小时前
C++ 文件操作
开发语言·c++·cocoa
轻口味8 小时前
【每日学点鸿蒙知识】Hap 安装失败、ArkTS 与C++ 数组转换、渐变遮罩效果等
c++·华为·harmonyos
YOULANSHENGMENG8 小时前
linux上使用cmake编译的方法
开发语言·c++