Home | History | Annotate | Download | only in greeter
      1 #include "greeter.grpc.fb.h"
      2 #include "greeter_generated.h"
      3 
      4 #include <grpc++/grpc++.h>
      5 
      6 #include <iostream>
      7 #include <memory>
      8 #include <string>
      9 
     10 class GreeterClient {
     11  public:
     12   GreeterClient(std::shared_ptr<grpc::Channel> channel)
     13     : stub_(Greeter::NewStub(channel)) {}
     14 
     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 
     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 
     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