| #include <grpcpp/grpcpp.h> | |
| #include <iostream> | |
| #include <memory> | |
| #include <string> | |
| #include "greeter.grpc.fb.h" | |
| #include "greeter_generated.h" | |
| class GreeterClient { | |
| public: | |
| GreeterClient(std::shared_ptr<grpc::Channel> channel) | |
| : stub_(Greeter::NewStub(channel)) {} | |
| std::string SayHello(const std::string& name) { | |
| flatbuffers::grpc::MessageBuilder mb; | |
| auto name_offset = mb.CreateString(name); | |
| auto request_offset = CreateHelloRequest(mb, name_offset); | |
| mb.Finish(request_offset); | |
| auto request_msg = mb.ReleaseMessage<HelloRequest>(); | |
| flatbuffers::grpc::Message<HelloReply> response_msg; | |
| grpc::ClientContext context; | |
| auto status = stub_->SayHello(&context, request_msg, &response_msg); | |
| if (status.ok()) { | |
| const HelloReply* response = response_msg.GetRoot(); | |
| return response->message()->str(); | |
| } else { | |
| std::cerr << status.error_code() << ": " << status.error_message() | |
| << std::endl; | |
| return "RPC failed"; | |
| } | |
| } | |
| void SayManyHellos(const std::string& name, int num_greetings, | |
| std::function<void(const std::string&)> callback) { | |
| flatbuffers::grpc::MessageBuilder mb; | |
| auto name_offset = mb.CreateString(name); | |
| auto request_offset = | |
| CreateManyHellosRequest(mb, name_offset, num_greetings); | |
| mb.Finish(request_offset); | |
| auto request_msg = mb.ReleaseMessage<ManyHellosRequest>(); | |
| flatbuffers::grpc::Message<HelloReply> response_msg; | |
| grpc::ClientContext context; | |
| auto stream = stub_->SayManyHellos(&context, request_msg); | |
| while (stream->Read(&response_msg)) { | |
| const HelloReply* response = response_msg.GetRoot(); | |
| callback(response->message()->str()); | |
| } | |
| auto status = stream->Finish(); | |
| if (!status.ok()) { | |
| std::cerr << status.error_code() << ": " << status.error_message() | |
| << std::endl; | |
| callback("RPC failed"); | |
| } | |
| } | |
| private: | |
| std::unique_ptr<Greeter::Stub> stub_; | |
| }; | |
| int main(int argc, char** argv) { | |
| std::string server_address("localhost:50051"); | |
| auto channel = | |
| grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); | |
| GreeterClient greeter(channel); | |
| std::string name("world"); | |
| std::string message = greeter.SayHello(name); | |
| std::cerr << "Greeter received: " << message << std::endl; | |
| int num_greetings = 10; | |
| greeter.SayManyHellos(name, num_greetings, [](const std::string& message) { | |
| std::cerr << "Greeter received: " << message << std::endl; | |
| }); | |
| return 0; | |
| } |