Skip to content
Snippets Groups Projects
Commit fd2d36bf authored by David Garcia Quintas's avatar David Garcia Quintas
Browse files

Comments for async client greeter

parent f9c32d62
No related branches found
No related tags found
No related merge requests found
...@@ -59,39 +59,73 @@ class GreeterClient { ...@@ -59,39 +59,73 @@ class GreeterClient {
explicit GreeterClient(std::shared_ptr<Channel> channel) explicit GreeterClient(std::shared_ptr<Channel> channel)
: stub_(Greeter::NewStub(channel)) {} : stub_(Greeter::NewStub(channel)) {}
// Assambles the client's payload, sends it and presents the response back
// from the server.
std::string SayHello(const std::string& user) { std::string SayHello(const std::string& user) {
// Data we are sending to the server.
HelloRequest request; HelloRequest request;
request.set_name(user); request.set_name(user);
// Container for the data we expect from the server.
HelloReply reply; HelloReply reply;
// Context for the client. It could be used to convey extra information to
// the server and/or tweak certain RPC behaviors.
ClientContext context; ClientContext context;
// The producer-consumer queue we use to communicate asynchronously with the
// gRPC runtmie.
CompletionQueue cq; CompletionQueue cq;
// Storage for the status of the RPC upon completion.
Status status; Status status;
// stub_->AsyncSayHello() perform the RPC call, returning an instance we
// store in "rpc". Because we are using the asynchronous API, we need the
// hold on to the "rpc" instance in order to get updates on the ongoig RPC.
std::unique_ptr<ClientAsyncResponseReader<HelloReply> > rpc( std::unique_ptr<ClientAsyncResponseReader<HelloReply> > rpc(
stub_->AsyncSayHello(&context, request, &cq)); stub_->AsyncSayHello(&context, request, &cq));
// Request that, upon completion of the RPC, "reply" be updated with the
// server's response; "status" with the indication of whether the operation
// was successful. Tag the request with the integer 1.
rpc->Finish(&reply, &status, (void*)1); rpc->Finish(&reply, &status, (void*)1);
void* got_tag; void* got_tag;
bool ok = false; bool ok = false;
// Block until the next result is available in the completion queue "cq".
cq.Next(&got_tag, &ok); cq.Next(&got_tag, &ok);
GPR_ASSERT(ok);
// Verify that the result from "cq" corresponds, by its tag, our previous
// request.
GPR_ASSERT(got_tag == (void*)1); GPR_ASSERT(got_tag == (void*)1);
// ... and that the request was completed successfully. Note that "ok"
// corresponds solely to the request for updates introduced by Finish().
GPR_ASSERT(ok);
// Act upon the status of the actual RPC.
if (status.ok()) { if (status.ok()) {
return reply.message(); return reply.message();
} else { } else {
return "Rpc failed"; return "RPC failed";
} }
} }
private: private:
// Out of the passed in Channel comes the stub, stored here, our view of the
// server's exposed services.
std::unique_ptr<Greeter::Stub> stub_; std::unique_ptr<Greeter::Stub> stub_;
}; };
int main(int argc, char** argv) { int main(int argc, char** argv) {
// Instantiate the client. It requires a channel, out of which the actual RPCs
// are created. This channel models a connection to an endpoint (in this case,
// localhost at port 50051). We indicate that the channel isn't authenticated
// (use of InsecureCredentials()) and we don't pass any special channel
// arguments (that could enable extra channel features, such as compression).
GreeterClient greeter(grpc::CreateChannel( GreeterClient greeter(grpc::CreateChannel(
"localhost:50051", grpc::InsecureCredentials(), ChannelArguments())); "localhost:50051", grpc::InsecureCredentials(), ChannelArguments()));
std::string user("world"); std::string user("world");
std::string reply = greeter.SayHello(user); std::string reply = greeter.SayHello(user); // The actual RPC call!
std::cout << "Greeter received: " << reply << std::endl; std::cout << "Greeter received: " << reply << std::endl;
return 0; return 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment