1 #include "greeter.grpc.fb.h"
2 #include "greeter_generated.h"
3
4 #include <grpcpp/grpcpp.h>
5
6 #include <iostream>
7 #include <memory>
8 #include <string>
9
10 class GreeterClient {
11 public:
GreeterClient(std::shared_ptr<grpc::Channel> channel)12 GreeterClient(std::shared_ptr<grpc::Channel> channel)
13 : stub_(Greeter::NewStub(channel)) {}
14
SayHello(const std::string & name)15 std::string SayHello(const std::string &name) {
16 flatbuffers::grpc::MessageBuilder mb;
17 auto name_offset = mb.CreateString(name);
18 auto request_offset = CreateHelloRequest(mb, name_offset);
19 mb.Finish(request_offset);
20 auto request_msg = mb.ReleaseMessage<HelloRequest>();
21
22 flatbuffers::grpc::Message<HelloReply> response_msg;
23
24 grpc::ClientContext context;
25
26 auto status = stub_->SayHello(&context, request_msg, &response_msg);
27 if (status.ok()) {
28 const HelloReply *response = response_msg.GetRoot();
29 return response->message()->str();
30 } else {
31 std::cerr << status.error_code() << ": " << status.error_message()
32 << std::endl;
33 return "RPC failed";
34 }
35 }
36
SayManyHellos(const std::string & name,int num_greetings,std::function<void (const std::string &)> callback)37 void SayManyHellos(const std::string &name, int num_greetings,
38 std::function<void(const std::string &)> callback) {
39 flatbuffers::grpc::MessageBuilder mb;
40 auto name_offset = mb.CreateString(name);
41 auto request_offset =
42 CreateManyHellosRequest(mb, name_offset, num_greetings);
43 mb.Finish(request_offset);
44 auto request_msg = mb.ReleaseMessage<ManyHellosRequest>();
45
46 flatbuffers::grpc::Message<HelloReply> response_msg;
47
48 grpc::ClientContext context;
49
50 auto stream = stub_->SayManyHellos(&context, request_msg);
51 while (stream->Read(&response_msg)) {
52 const HelloReply *response = response_msg.GetRoot();
53 callback(response->message()->str());
54 }
55 auto status = stream->Finish();
56 if (!status.ok()) {
57 std::cerr << status.error_code() << ": " << status.error_message()
58 << std::endl;
59 callback("RPC failed");
60 }
61 }
62
63 private:
64 std::unique_ptr<Greeter::Stub> stub_;
65 };
66
main(int argc,char ** argv)67 int main(int argc, char **argv) {
68 std::string server_address("localhost:50051");
69
70 auto channel =
71 grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials());
72 GreeterClient greeter(channel);
73
74 std::string name("world");
75
76 std::string message = greeter.SayHello(name);
77 std::cerr << "Greeter received: " << message << std::endl;
78
79 int num_greetings = 10;
80 greeter.SayManyHellos(name, num_greetings, [](const std::string &message) {
81 std::cerr << "Greeter received: " << message << std::endl;
82 });
83
84 return 0;
85 }
86