|  | @@ -0,0 +1,85 @@
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Copyright 2018 gRPC authors.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Licensed under the Apache License, Version 2.0 (the "License");
 | 
	
		
			
				|  |  | + * you may not use this file except in compliance with the License.
 | 
	
		
			
				|  |  | + * You may obtain a copy of the License at
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + *     http://www.apache.org/licenses/LICENSE-2.0
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Unless required by applicable law or agreed to in writing, software
 | 
	
		
			
				|  |  | + * distributed under the License is distributed on an "AS IS" BASIS,
 | 
	
		
			
				|  |  | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
	
		
			
				|  |  | + * See the License for the specific language governing permissions and
 | 
	
		
			
				|  |  | + * limitations under the License.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#include <iostream>
 | 
	
		
			
				|  |  | +#include <memory>
 | 
	
		
			
				|  |  | +#include <string>
 | 
	
		
			
				|  |  | +#include <vector>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#include <grpcpp/grpcpp.h>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#ifdef BAZEL_BUILD
 | 
	
		
			
				|  |  | +#include "examples/protos/keyvaluestore.grpc.pb.h"
 | 
	
		
			
				|  |  | +#else
 | 
	
		
			
				|  |  | +#include "keyvaluestore.grpc.pb.h"
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +using grpc::Channel;
 | 
	
		
			
				|  |  | +using grpc::ClientContext;
 | 
	
		
			
				|  |  | +using grpc::Status;
 | 
	
		
			
				|  |  | +using keyvaluestore::Request;
 | 
	
		
			
				|  |  | +using keyvaluestore::Response;
 | 
	
		
			
				|  |  | +using keyvaluestore::KeyValueStore;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class KeyValueStoreClient {
 | 
	
		
			
				|  |  | + public:
 | 
	
		
			
				|  |  | +  KeyValueStoreClient(std::shared_ptr<Channel> channel)
 | 
	
		
			
				|  |  | +      : stub_(KeyValueStore::NewStub(channel)) {}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Assembles the client's payload, sends it and presents the response back
 | 
	
		
			
				|  |  | +  // from the server.
 | 
	
		
			
				|  |  | +  void GetValues(const std::vector<std::string>& keys) {
 | 
	
		
			
				|  |  | +    // Context for the client. It could be used to convey extra information to
 | 
	
		
			
				|  |  | +    // the server and/or tweak certain RPC behaviors.
 | 
	
		
			
				|  |  | +    ClientContext context;
 | 
	
		
			
				|  |  | +    auto stream = stub_->GetValues(&context);
 | 
	
		
			
				|  |  | +    for (const auto& key:keys) {
 | 
	
		
			
				|  |  | +      // Data we are sending to the server.
 | 
	
		
			
				|  |  | +      Request request;
 | 
	
		
			
				|  |  | +      request.set_key(key);
 | 
	
		
			
				|  |  | +      stream->Write(request);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      Response response;
 | 
	
		
			
				|  |  | +      stream->Read(&response);
 | 
	
		
			
				|  |  | +      std::cout << key << " : " << response.value() << "\n";
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    stream->WritesDone();
 | 
	
		
			
				|  |  | +    Status status = stream->Finish();
 | 
	
		
			
				|  |  | +    if(!status.ok()) {
 | 
	
		
			
				|  |  | +      std::cout << status.error_code() << ": " << status.error_message()
 | 
	
		
			
				|  |  | +                << std::endl;
 | 
	
		
			
				|  |  | +      std::cout << "RPC failed";
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | + private:
 | 
	
		
			
				|  |  | +  std::unique_ptr<KeyValueStore::Stub> stub_;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +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 InsecureChannelCredentials()).
 | 
	
		
			
				|  |  | +  KeyValueStoreClient client(grpc::CreateChannel(
 | 
	
		
			
				|  |  | +      "localhost:50051", grpc::InsecureChannelCredentials()));
 | 
	
		
			
				|  |  | +  std::vector<std::string>  keys = {"key1", "key2", "key3", "key4", "key5"};
 | 
	
		
			
				|  |  | +  client.GetValues(keys);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return 0;
 | 
	
		
			
				|  |  | +}
 |