xref: /aosp_15_r20/external/grpc-grpc/examples/cpp/multiplex/multiplex_client.cc (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker /*
2*cc02d7e2SAndroid Build Coastguard Worker  *
3*cc02d7e2SAndroid Build Coastguard Worker  * Copyright 2023 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker  *
5*cc02d7e2SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker  *
9*cc02d7e2SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker  *
11*cc02d7e2SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker  * limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker  *
17*cc02d7e2SAndroid Build Coastguard Worker  */
18*cc02d7e2SAndroid Build Coastguard Worker #include <condition_variable>
19*cc02d7e2SAndroid Build Coastguard Worker #include <iostream>
20*cc02d7e2SAndroid Build Coastguard Worker #include <memory>
21*cc02d7e2SAndroid Build Coastguard Worker #include <mutex>
22*cc02d7e2SAndroid Build Coastguard Worker #include <string>
23*cc02d7e2SAndroid Build Coastguard Worker #include <vector>
24*cc02d7e2SAndroid Build Coastguard Worker 
25*cc02d7e2SAndroid Build Coastguard Worker #include "absl/flags/flag.h"
26*cc02d7e2SAndroid Build Coastguard Worker #include "absl/flags/parse.h"
27*cc02d7e2SAndroid Build Coastguard Worker 
28*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/grpcpp.h>
29*cc02d7e2SAndroid Build Coastguard Worker 
30*cc02d7e2SAndroid Build Coastguard Worker #ifdef BAZEL_BUILD
31*cc02d7e2SAndroid Build Coastguard Worker #include "examples/protos/helloworld.grpc.pb.h"
32*cc02d7e2SAndroid Build Coastguard Worker #include "examples/protos/route_guide.grpc.pb.h"
33*cc02d7e2SAndroid Build Coastguard Worker #else
34*cc02d7e2SAndroid Build Coastguard Worker #include "helloworld.grpc.pb.h"
35*cc02d7e2SAndroid Build Coastguard Worker #include "route_guide.grpc.pb.h"
36*cc02d7e2SAndroid Build Coastguard Worker #endif
37*cc02d7e2SAndroid Build Coastguard Worker 
38*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(std::string, target, "localhost:50051", "Server address");
39*cc02d7e2SAndroid Build Coastguard Worker 
40*cc02d7e2SAndroid Build Coastguard Worker using grpc::Channel;
41*cc02d7e2SAndroid Build Coastguard Worker using grpc::ClientContext;
42*cc02d7e2SAndroid Build Coastguard Worker using grpc::Status;
43*cc02d7e2SAndroid Build Coastguard Worker 
main(int argc,char ** argv)44*cc02d7e2SAndroid Build Coastguard Worker int main(int argc, char** argv) {
45*cc02d7e2SAndroid Build Coastguard Worker   absl::ParseCommandLine(argc, argv);
46*cc02d7e2SAndroid Build Coastguard Worker   // Instantiate the client. It requires a channel, out of which the actual RPCs
47*cc02d7e2SAndroid Build Coastguard Worker   // are created. This channel models a connection to an endpoint specified by
48*cc02d7e2SAndroid Build Coastguard Worker   // the argument "--target=" which is the only expected argument.
49*cc02d7e2SAndroid Build Coastguard Worker   std::string target_str = absl::GetFlag(FLAGS_target);
50*cc02d7e2SAndroid Build Coastguard Worker   // We indicate that the channel isn't authenticated (use of
51*cc02d7e2SAndroid Build Coastguard Worker   // InsecureChannelCredentials()).
52*cc02d7e2SAndroid Build Coastguard Worker   auto channel =
53*cc02d7e2SAndroid Build Coastguard Worker       grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials());
54*cc02d7e2SAndroid Build Coastguard Worker 
55*cc02d7e2SAndroid Build Coastguard Worker   std::mutex mu;
56*cc02d7e2SAndroid Build Coastguard Worker   std::condition_variable cv;
57*cc02d7e2SAndroid Build Coastguard Worker   int done_count = 0;
58*cc02d7e2SAndroid Build Coastguard Worker 
59*cc02d7e2SAndroid Build Coastguard Worker   // Callbacks will be called on background threads
60*cc02d7e2SAndroid Build Coastguard Worker   std::unique_lock<std::mutex> lock(mu);
61*cc02d7e2SAndroid Build Coastguard Worker 
62*cc02d7e2SAndroid Build Coastguard Worker   ClientContext hello_context;
63*cc02d7e2SAndroid Build Coastguard Worker   helloworld::HelloRequest hello_request;
64*cc02d7e2SAndroid Build Coastguard Worker   helloworld::HelloReply hello_response;
65*cc02d7e2SAndroid Build Coastguard Worker   Status hello_status;
66*cc02d7e2SAndroid Build Coastguard Worker 
67*cc02d7e2SAndroid Build Coastguard Worker   ClientContext feature_context;
68*cc02d7e2SAndroid Build Coastguard Worker   routeguide::Point feature_request;
69*cc02d7e2SAndroid Build Coastguard Worker   routeguide::Feature feature_response;
70*cc02d7e2SAndroid Build Coastguard Worker   Status feature_status;
71*cc02d7e2SAndroid Build Coastguard Worker   // Request to a Greeter service
72*cc02d7e2SAndroid Build Coastguard Worker   hello_request.set_name("user");
73*cc02d7e2SAndroid Build Coastguard Worker   helloworld::Greeter::NewStub(channel)->async()->SayHello(
74*cc02d7e2SAndroid Build Coastguard Worker       &hello_context, &hello_request, &hello_response, [&](Status status) {
75*cc02d7e2SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(mu);
76*cc02d7e2SAndroid Build Coastguard Worker         done_count++;
77*cc02d7e2SAndroid Build Coastguard Worker         hello_status = std::move(status);
78*cc02d7e2SAndroid Build Coastguard Worker         cv.notify_all();
79*cc02d7e2SAndroid Build Coastguard Worker       });
80*cc02d7e2SAndroid Build Coastguard Worker   // Request to a RouteGuide service
81*cc02d7e2SAndroid Build Coastguard Worker   feature_request.set_latitude(50);
82*cc02d7e2SAndroid Build Coastguard Worker   feature_request.set_longitude(100);
83*cc02d7e2SAndroid Build Coastguard Worker   routeguide::RouteGuide::NewStub(channel)->async()->GetFeature(
84*cc02d7e2SAndroid Build Coastguard Worker       &feature_context, &feature_request, &feature_response,
85*cc02d7e2SAndroid Build Coastguard Worker       [&](Status status) {
86*cc02d7e2SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(mu);
87*cc02d7e2SAndroid Build Coastguard Worker         done_count++;
88*cc02d7e2SAndroid Build Coastguard Worker         feature_status = std::move(status);
89*cc02d7e2SAndroid Build Coastguard Worker         cv.notify_all();
90*cc02d7e2SAndroid Build Coastguard Worker       });
91*cc02d7e2SAndroid Build Coastguard Worker   // Wait for both requests to finish
92*cc02d7e2SAndroid Build Coastguard Worker   cv.wait(lock, [&]() { return done_count == 2; });
93*cc02d7e2SAndroid Build Coastguard Worker   if (hello_status.ok()) {
94*cc02d7e2SAndroid Build Coastguard Worker     std::cout << "Greeter received: " << hello_response.message() << std::endl;
95*cc02d7e2SAndroid Build Coastguard Worker   } else {
96*cc02d7e2SAndroid Build Coastguard Worker     std::cerr << "Greeter failed: " << hello_status.error_message()
97*cc02d7e2SAndroid Build Coastguard Worker               << std::endl;
98*cc02d7e2SAndroid Build Coastguard Worker   }
99*cc02d7e2SAndroid Build Coastguard Worker   if (feature_status.ok()) {
100*cc02d7e2SAndroid Build Coastguard Worker     std::cout << "Found feature: " << feature_response.name() << std::endl;
101*cc02d7e2SAndroid Build Coastguard Worker   } else {
102*cc02d7e2SAndroid Build Coastguard Worker     std::cerr << "Getting feature failed: " << feature_status.error_message()
103*cc02d7e2SAndroid Build Coastguard Worker               << std::endl;
104*cc02d7e2SAndroid Build Coastguard Worker   }
105*cc02d7e2SAndroid Build Coastguard Worker   return 0;
106*cc02d7e2SAndroid Build Coastguard Worker }
107