code: public IOReadableWritable call(IOReadableWritable param, InetSocketAddress addr, Class<?> protocol)
  			throws InterruptedException, IOException {
  		Call call = new Call(param);
  		Connection connection = getConnection(addr, protocol, call);
  		connection.sendParam(call); // send the parameter
  		synchronized (call) {
  			while (!call.done) {
  				try {
  					call.wait(); // wait for the result
  				} catch (InterruptedException ignored) {
  				}
  			}
  
  			if (call.error != null) {
  				if (call.error instanceof RemoteException) {
  					call.error.fillInStackTrace();
  					throw call.error;
  				} else { // local exception
  					throw wrapException(addr, call.error);
  				}
  			} else {
  				return call.value;
  			}
  		}
  	}
docs: Make a call, passing <code>param</code>, to the IPC server running at <code>address</code> which is servicing the
  <code>protocol</code> protocol,
  with the <code>ticket</code> credentials, returning the value.
  Throws exceptions if there are network problems or if the remote code
  threw an exception.