code: protected synchronized ClientImpl getClient() throws UnknownHostException, IOException
      {
          ClientImpl retClient = (ClientImpl) this.client.get() ;
          if (retClient != null) {
              return retClient;
          }
          return this.createClientAndConnect();
      }
docs: Get current client or reconnect one as needed.
  Concurrency strategy: If the connection is lost while providing one the
  caller will get a non-null, but ultimately bad connection that will fail.
  But it won't cause an NPE. This method is synchronized so that a
  reconnection won't happen simultaneously. The client won't get dropped
  if a parallel thread comes in later trying to drop the original client
  because dropClient() only does it if the request matches the current client.
  @return  client
  @throws UnknownHostException
  @throws IOException