基于VS2022在Windows上首次尝试开发C++ gRPC服务端和客户端的详细步骤
文章目录
- **1. 创建解决方案与项目**
- **2. 编写proto文件**
- **3. 生成gRPC代码**
- **4. 配置项目属性**
- **服务端项目(gRPCServer)**
- **客户端项目(gRPCClient)**
- **5. 实现服务端代码**
- **6. 实现客户端代码**
- **7. 编译与运行**
- **注意事项**
我已经通过vcpkg安装好本地grpc环境
1. 创建解决方案与项目
- 打开VS2022 → 创建新项目 → 选择 “空项目” ,分别创建服务端(如
gRPCServer
)和客户端(如gRPCClient
)项目 - 右键解决方案 → 添加 → 新建项 → “头文件(.h)” 和 “源文件(.cpp)” ,分别用于服务端和客户端代码
2. 编写proto文件
- 在解决方案目录下创建
protos
文件夹,新建greet.proto
文件(示例内容如下):
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest { string name = 1; }
message HelloReply { string message = 1; }
3. 生成gRPC代码
- 打开开发者命令行工具,执行以下命令(注意路径替换):
# 生成消息序列化代码
protoc -I=protos/ --cpp_out=protos/ protos/greet.proto
# 生成gRPC服务代码(注意grpc_cpp_plugin路径)
protoc -I=protos/ --grpc_out=protos/ --plugin=protoc-gen-grpc="C:\vcpkg\vcpkg\installed\x64-windows\tools\grpc\grpc_cpp_plugin.exe" protos/greet.proto
生成greet.pb.h
、greet.pb.cc
、greet.grpc.pb.h
、greet.grpc.pb.cc
四个文件
4. 配置项目属性
服务端项目(gRPCServer)
- C/C++ → 常规 → 附加包含目录 添加:
C:\vcpkg\vcpkg\installed\x64-windows\include
$(ProjectDir)\protos
- 链接器 → 常规 → 附加库目录 添加:
C:\vcpkg\vcpkg\installed\x64-windows\lib
- 链接器 → 输入 → 附加依赖项 添加:
grpc++.lib;grpc++_reflection.lib;grpc.lib;gpr.lib;protobuf.lib;libprotoc.lib
- C/C++ → 语言 → C++ 语言标准 设置为 “ISO C++17 标准”
客户端项目(gRPCClient)
配置步骤同上,与服务端完全一致
5. 实现服务端代码
在gRPCServer
项目中添加server.cpp
:
#include <grpcpp/grpcpp.h>
#include "protos/greet.grpc.pb.h"
class GreeterServiceImpl final : public Greeter::Service {
grpc::Status SayHello(grpc::ServerContext* context,
const HelloRequest* request,
HelloReply* reply) override {
reply->set_message("Hello " + request->name());
return grpc::Status::OK;
}
};
void RunServer() {
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<grpc::Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << server_address << std::endl;
server->Wait();
}
int main() {
RunServer();
return 0;
}
6. 实现客户端代码
在gRPCClient
项目中添加client.cpp
:
#include <grpcpp/grpcpp.h>
#include "protos/greet.grpc.pb.h"
class GreeterClient {
public:
GreeterClient(std::shared_ptr<grpc::Channel> channel)
: stub_(Greeter::NewStub(channel)) {}
std::string SayHello(const std::string& name) {
HelloRequest request;
request.set_name(name);
HelloReply reply;
grpc::ClientContext context;
grpc::Status status = stub_->SayHello(&context, request, &reply);
if (status.ok()) return reply.message();
else return "RPC failed";
}
private:
std::unique_ptr<Greeter::Stub> stub_;
};
int main() {
GreeterClient client(grpc::CreateChannel("localhost:50051",
grpc::InsecureChannelCredentials()));
std::cout << client.SayHello("World") << std::endl;
return 0;
}
7. 编译与运行
- 生成解决方案:右键解决方案 → 生成解决方案
- 启动服务端:右键
gRPCServer
→ 调试 → 启动新实例 - 启动客户端:右键
gRPCClient
→ 调试 → 启动新实例- 正确输出应为:
Hello World
- 正确输出应为:
注意事项
- 若出现 “无法打开 grpc++/impl/codegen/config.h” 错误,检查vcpkg是否安装完整(执行
vcpkg install grpc:x64-windows
) - 若链接失败,确认所有
.lib
文件是否存在于C:\vcpkg\vcpkg\installed\x64-windows\lib
目录
加粗样式