private IRemoteCallObject doCall(long connectionId, String command, Object params) throws Exception {
    ISocketServerConnection ssc = getConnectionById(connectionId);
    if (ssc == null) {
      catchException(this, new Exception("Call.Connection by index (" + connectionId + ") not found."));
    }

    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 {
        addCallToConnection(connectionId, callId);
        ssc.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 responseData(connectionId, rco);
      }
      finally {
        remCallObj(callId); //..remove call from map
        remCallFromConnection(connectionId, callId); //..remove call from connection
      }
    }
  }