0. 安装vcpkg
1 2 3
| https://github.com/microsoft/vcpkg.git .\bootstrap-vcpkg.bat vcpkg --version
|
1.grpc安装与编译
1
| vcpkg install grpc:x64-windows
|
2.protocbuf安装与编译
1
| vcpkg install protobuf protobuf:x64-windows
|
安装后,您可以在文件夹 <vcpkg_installed_path>\packages 下的 vcpkg 目录中找到已安装的软件包。 为了使软件包在系统范围内可用,您需要使用命令:
注:以上安装完大约47GB
1. 创建解决方案与项目
- 打开VS2022 → 创建新项目 → 选择 “空项目” ,分别创建服务端(如
gRPCServer)和客户端(如gRPCClient)项目 - 右键解决方案 → 添加 → 新建项 → “头文件(.h)” 和 “源文件(.cpp)” ,分别用于服务端和客户端代码
2. 编写proto文件
- 在解决方案目录下创建
protos文件夹,新建greet.proto文件(示例内容如下):
1 2 3 4 5 6
| syntax = "proto3"; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
|
3. 生成gRPC代码
- 打开开发者命令行工具,执行以下命令(注意路径替换):
1 2 3 4 5
| protoc -I=protos/ --cpp_out=protos/ protos/greet.proto
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++ → 常规 → 附加包含目录 添加:
1 2
| C:\vcpkg\vcpkg\installed\x64-windows\include $(ProjectDir)\protos
|
- 链接器 → 常规 → 附加库目录 添加:
1
| C:\vcpkg\vcpkg\installed\x64-windows\lib
|
- 链接器 → 输入 → 附加依赖项 添加:
1
| grpc++.lib;grpc++_reflection.lib;grpc.lib;gpr.lib;libprotobuf.lib;libprotoc.lib
|
- C/C++ → 语言 → C++ 语言标准 设置为 “ISO C++17 标准”
客户端项目(gRPCClient)
配置步骤同上,与服务端完全一致
5. 实现服务端代码
在gRPCServer项目中添加server.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #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 → 调试 → 启动新实例
注意事项
- 若出现 “无法打开 grpc++/impl/codegen/config.h” 错误,检查vcpkg是否安装完整(执行
vcpkg install grpc:x64-windows) - 若链接失败,确认所有
.lib文件是否存在于C:\vcpkg\vcpkg\installed\x64-windows\lib目录
服务器端输出:
Server listening on 0.0.0.0:50051
客户端输出:
Hello World
Press Enter to exit…