@Override
  public IRemoteCallObject call(String command, Object params) throws Exception {
    checkInitiate();

    final IRemoteCallObject rco = new RemoteCallObject();
    synchronized (rco) {
      long callId = getNextCallId();
      rco.setCallObjectId(callId);
      rco.setMetaDataObject(new RemoteCallObjectMetaData(command, RemoteCallObjectType.Query));
      rco.setDataObject(new RemoteCallObjectData(params));

      putCallObj(callId, rco); //..put object to map
      try {
        send(SerializeUtils.serializeToBytes(rco)); //..to do call and wait response
        try {
          rco.wait(); //..wait response from server side socket
        }
        catch(InterruptedException e) {
          throw e;
        }
        //..comming response from server side socket, accept it (with error or not)
        return acceptResponse(rco);
      }
      finally {
        remCallObj(callId); //..remove object from map
      }
    }
  }