/**
   * Constructor - gets called from the SIPStack class with a socket on accepting a new client. All
   * the processing of the message is done here with the sipStack being freed up to handle new
   * connections. The sock input is the socket that is returned from the accept. Global data that is
   * shared by all threads is accessible in the Server structure.
   *
   * @param sock Socket from which to read and write messages. The socket is already connected (was
   *     created as a result of an accept).
   * @param sipStack Ptr to SIP Stack
   */
  protected TCPMessageChannel(
      Socket sock,
      SIPTransactionStack sipStack,
      TCPMessageProcessor msgProcessor,
      String threadName)
      throws IOException {

    super(sipStack);
    if (logger.isLoggingEnabled(LogWriter.TRACE_DEBUG)) {
      logger.logDebug("creating new TCPMessageChannel ");
      logger.logStackTrace();
    }
    mySock = sock;
    peerAddress = mySock.getInetAddress();
    myAddress = msgProcessor.getIpAddress().getHostAddress();
    myClientInputStream = mySock.getInputStream();
    myClientOutputStream = mySock.getOutputStream();
    mythread = new Thread(this);
    mythread.setDaemon(true);
    mythread.setName(threadName);
    this.peerPort = mySock.getPort();
    this.key = MessageChannel.getKey(peerAddress, peerPort, "TCP");

    this.myPort = msgProcessor.getPort();
    // Bug report by Vishwashanti Raj Kadiayl
    super.messageProcessor = msgProcessor;
    // Can drop this after response is sent potentially.
    mythread.start();
  }
  /**
   * Constructor - connects to the given inet address. Acknowledgement -- Lamine Brahimi (IBM
   * Zurich) sent in a bug fix for this method. A thread was being uncessarily created.
   *
   * @param inetAddr inet address to connect to.
   * @param sipStack is the sip sipStack from which we are created.
   * @throws IOException if we cannot connect.
   */
  protected TCPMessageChannel(
      InetAddress inetAddr,
      int port,
      SIPTransactionStack sipStack,
      TCPMessageProcessor messageProcessor)
      throws IOException {

    super(sipStack);
    if (logger.isLoggingEnabled(LogWriter.TRACE_DEBUG)) {
      logger.logDebug("creating new TCPMessageChannel ");
      logger.logStackTrace();
    }
    this.peerAddress = inetAddr;
    this.peerPort = port;
    this.myPort = messageProcessor.getPort();
    this.peerProtocol = "TCP";
    this.myAddress = messageProcessor.getIpAddress().getHostAddress();
    // Bug report by Vishwashanti Raj Kadiayl
    this.key = MessageChannel.getKey(peerAddress, peerPort, "TCP");
    super.messageProcessor = messageProcessor;
  }