文章目录
- 0. 启动程序
- 1. 未作修改部分
-
- 2. 添加注释部分
- 2.1 server.cc
- 2.2 client.cc
- 3. 重点修改部分
- 3.1 CMakeLists.txt原始代码
- 3.2 CMakeLists.txt精简修改代码
【gRPC C++简单示例及代码】原文链接
已能够进行初步修改
新建fyo文件夹,在fyo中新建build、include文件夹
进入build文件夹,输入cmake ..
和make -j
,实现了链接中下列代码的功能:
protoc --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` demo.proto
protoc --cpp_out=. demo.proto
0. 启动程序
终端1
./demoServer
终端2
./demoClient
1. 未作修改部分
1.1 demo.proto
syntax = "proto3";
package ZYF;
service YServer {
rpc GetNum(Num) returns (Res) {}
rpc GetVec(stream Vec) returns (stream Vec) {}
}
message Num {
int32 x = 1;
}
message Res {
int32 y = 1;
}
message Vec {
repeated int32 v = 1;
}
2. 添加注释部分
2.1 server.cc
#include <iostream>
#include <string>
#include <grpcpp/grpcpp.h>
#include "demo.grpc.pb.h"
class DemoServiceImpl final : public ZYF::YServer::Service {
grpc::Status GetNum(grpc::ServerContext* context, const ZYF::Num* req, ZYF::Res* res) override {
std::cout << "Req get:" << req->x() << std::endl;
res->set_y(req->x() + 1);
return grpc::Status::OK;
}
grpc::Status GetVec(grpc::ServerContext* context, grpc::ServerReaderWriter<ZYF::Vec, ZYF::Vec>* stream) override {
ZYF::Vec req;
while (stream->Read(&req)) {
std::cout << "[stream]: Received message!" << std::endl;
auto vec = req.v();
for (auto it = vec.begin(); it != vec.end(); it++) {
(*it)++;
}
stream->Write(req);
}
return grpc::Status::OK;
}
};
void RunServer() {
std::string serverAddr("0.0.0.0:50051");
DemoServiceImpl service;
grpc::ServerBuilder builder;
builder.AddListeningPort(serverAddr, grpc::InsecureServerCredentials());
builder.RegisterService(&service);
std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
std::cout << "Server listening on:" << serverAddr << std::endl;
server->Wait();
}
int main(int argc, char** argv) {
RunServer();
return 0;
}
2.2 client.cc
#include <iostream>
#include <string>
#include <grpcpp/grpcpp.h>
#include "demo.grpc.pb.h"
class Client {
public:
Client(std::shared_ptr<grpc::Channel> channel):stub_(ZYF::YServer::NewStub(channel)){}
int SendRequest() {
ZYF::Num req;
req.set_x(3);
ZYF::Res res;
grpc::ClientContext context;
grpc::Status status = stub_->GetNum(&context, req, &res);
if (!status.ok()) {
return -1;
}
return res.y();
}
void SendRequestStream() {
grpc::ClientContext context;
std::shared_ptr<grpc::ClientReaderWriter<ZYF::Vec, ZYF::Vec>> stream(stub_->GetVec(&context));
for (int i = 0; i < 5; ++i) {
ZYF::Vec req;
for (int j = 0; j < 10; ++j) {
req.add_v(j);
}
if (!stream->Write(req)) {
std::cout << "The stream has been closed!" << std::endl;
break;
}
std::cout << "Send a message based on stream!" << std::endl;
}
stream->WritesDone();
ZYF::Vec res;
while (stream->Read(&res)) {
std::cout << "Receive a reply!" << std::endl;
auto reply = res.v();
for (auto it = reply.begin(); it != reply.end(); it++) {
std::cout << (*it) << " " << std::endl;
}
std::cout << std::endl;
}
stream->Finish();
}
private:
std::unique_ptr<ZYF::YServer::Stub> stub_;
};
int main(int argc, char** argv) {
Client client(grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()));
std::cout << "Got Response:" << client.SendRequest() << std::endl;
client.SendRequestStream();
return 0;
}
3. 重点修改部分
3.1 CMakeLists.txt原始代码
cmake_minimum_required(VERSION 3.5.1)
project(DemoGrpc C CXX)
include(./common.cmake)
set(proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/../demo.pb.cc")
set(proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/../demo.pb.h")
set(grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/../demo.grpc.pb.cc")
set(grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/../demo.grpc.pb.h")
include_directories("${CMAKE_CURRENT_BINARY_DIR}")
add_library(grpc_proto ${proto_srcs} ${proto_hdrs} ${grpc_srcs} ${grpc_hdrs})
target_link_libraries(grpc_proto ${_REFLECTION} ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF})
add_executable(demoServer "server.cc")
add_executable(demoClient "client.cc")
target_link_libraries(demoServer grpc_proto ${_REFLECTION} ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF})
target_link_libraries(demoClient grpc_proto ${_REFLECTION} ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF})
3.2 CMakeLists.txt精简修改代码
cmake_minimum_required(VERSION 3.2)
project(xxxxx)
include(./common.cmake)
# Generated sources
set(coordinate_proto_srcs "${CMAKE_BINARY_DIR}/../include/demo.pb.cc")
set(coordinate_proto_hdrs "${CMAKE_BINARY_DIR}/../include/demo.pb.h")
set(coordinate_grpc_srcs "${CMAKE_BINARY_DIR}/../include/demo.grpc.pb.cc")
set(coordinate_grpc_hdrs "${CMAKE_BINARY_DIR}/../include/demo.grpc.pb.h")
include_directories(include)
# rg_grpc_proto
add_library(coordinate_grpc_proto ${coordinate_grpc_srcs} ${coordinate_grpc_hdrs} ${coordinate_proto_srcs} {coordinate_proto_hdrs})
target_link_libraries(coordinate_grpc_proto ${_REFLECTION} ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF})
add_executable(demoServer "server.cc")
add_executable(demoClient "client.cc")
target_link_libraries(demoServer coordinate_grpc_proto ${_REFLECTION} ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF})
target_link_libraries(demoClient coordinate_grpc_proto ${_REFLECTION} ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF})
get_filename_component(coordinate_proto "./demo.proto" ABSOLUTE)
get_filename_component(coordinate_proto_path "${coordinate_proto}" PATH)
# 以下为较原代码新增加部分
add_custom_command(
OUTPUT "${coordinate_proto_srcs}" "${coordinate_proto_hdrs}" "${coordinate_grpc_srcs}" "${coordinate_grpc_hdrs}"
COMMAND ${_PROTOBUF_PROTOC}
ARGS --grpc_out "${CMAKE_BINARY_DIR}/../include"
--cpp_out "${CMAKE_BINARY_DIR}/../include"
-I "${coordinate_proto_path}"
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
"${coordinate_proto}"
DEPENDS "${coordinate_proto}")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)