/**
   * Starts a active association to a communication partner. See PS 3.8 - 7.1 A-ASSOCIATE SERVICE
   *
   * @return true, if association was successful established.
   * @exception ConnectException
   * @exception IOException
   * @exception GeneralSecurityException
   */
  public boolean aASSOCIATE() throws ConnectException, IOException, GeneralSecurityException {

    // No association may be active
    if (assoc != null) {
      throw new ConnectException("Association already established");
    }

    // New Association object for establishing an active association
    assoc = aFact.newRequestor(newSocket(url.getHost(), url.getPort()));

    // >>>> Fill the Association object with relevant data
    assoc.setAcTimeout(acTimeout);
    assoc.setDimseTimeout(dimseTimeout);
    assoc.setSoCloseDelay(soCloseDelay);
    assoc.setPackPDVs(packPDVs);

    // 1. Create an communication channel to the communication partner defined in the Association
    // object
    // 2. Send the A-ASSOCIATE-RQ package
    // 3. Receive the aAssociation acknowlage/reject package from the communication partner as a PDU
    // (Protocol Data Unit)
    PDU assocAC = assoc.connect(assocRQ);

    if (!(assocAC instanceof AAssociateAC)) {
      // Acknowlage is A-ASSOCIATE-RJ
      // Association rejected
      assoc = null;

      // Return aASSOCIATE faild
      return false;
    }
    // Acknowlage is A-ASSOCIATE_AC
    // Association accepted

    // Start the accepted association
    // API doc: AssociationFactory.newActiveAssociation(Association assoc, DcmServiceRegistry
    // services)
    aassoc = aFact.newActiveAssociation(assoc, null);
    aassoc.start();

    // Return successfull opened
    return true;
  }