public void connect()
{

    if (ipAddrS == null || ipAddr == null){
        tsLog.appendLine(
                "Notcher Unit #" + index + " never responded to "
                + "roll call and cannot be contacted.");
        return;
    }

    tsLog.appendLine("Opening connection with Notcher...");

    try {

        tsLog.appendLine("Notcher Unit IP Address: " + ipAddr.toString());

        if (!simulate) {
            socket = new Socket(ipAddr, 23);
        }
        else {

            NotcherSimulator notcherSimulator = 
                                            new NotcherSimulator( ipAddr, 23);
            notcherSimulator.init();
            
            socket = notcherSimulator;
            
        }

        //set amount of time in milliseconds that a read from the socket will
        //wait for data - this prevents program lock up when no data is ready
        socket.setSoTimeout(250);

        out = new PrintWriter(socket.getOutputStream(), true);

        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        byteOut = new DataOutputStream(socket.getOutputStream());
        byteIn =  new DataInputStream(socket.getInputStream());

    }//try
    catch (IOException e) {
        logSevere(e.getMessage() + " - Error: 238");
        tsLog.appendLine("Couldn't get I/O for " + ipAddrS);
        return;
    }

    try {
        //display the greeting message sent by the remote
        tsLog.appendLine(ipAddrS + " says " + in.readLine());
    }
    catch(IOException e){
        logSevere(e.getMessage() + " - Error: 248");
    }

    //flag that board setup has been completed - whether it failed or not
    setupComplete = true;

    //flag that setup was successful and board is ready for use
    ready = true;


    tsLog.appendLine("Notcher " + ipAddrS + " is ready.");

}//end of Notcher::connect