86 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "greeter.grpc.fb.h"
 | |
| #include "greeter_generated.h"
 | |
| 
 | |
| #include <grpc++/grpc++.h>
 | |
| 
 | |
| #include <iostream>
 | |
| #include <memory>
 | |
| #include <string>
 | |
| 
 | |
| 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;
 | |
| }
 |