@Override
 public void run() {
   try {
     // loop endlessly waiting for client connections
     while (true) {
       if (!streamsOpen) {
         // wait for a connection request
         socket = ss.accept();
         gui.setTextArea1("Connected to QD on port " + port, Color.ORANGE);
         gui.setLabel("Connected to QD on port " + port, Color.GREEN);
         log.writeToLog("Connected to QD on port " + port);
         openStreams();
         setConnected();
         processClientRequests();
       } else {
         gui.setTextArea1("Streams already open on port" + port, Color.ORANGE);
         gui.setLabel("Streams already open on port " + port, Color.GREEN);
         log.writeToLog("Streams already open on port " + port);
         closeStreams();
       }
     }
   } catch (IOException e) {
     gui.setLabel("Trouble with accepting Socket on port " + port + ": " + e, Color.RED);
     gui.setTextArea1("Trouble with accepting Socket on port " + port, Color.ORANGE);
     log.writeToLog("Trouble with accepting Socket on port " + port);
     closeStreams();
   }
 }
  // Constructor
  public ServerListener(String portNumber, MSeriesGUI theGui) // Start Constructor
      {
    gui = theGui;
    port = Integer.parseInt(portNumber);
    streamsOpen = false;
    printerName = gui.getPrinterName();
    log = new MLogs(gui, printerName);
    log.createLogFile();

    // establish a ServerSocket
    try {
      ss = new ServerSocket(port);
      gui.setTextArea1("Waiting for connection ... ", Color.ORANGE);
      log.writeToLog("Waiting for connection ... ");
    } catch (BindException b) {
      gui.setLabel("Port " + port + " already in use", Color.RED);
      gui.setTextArea1("Port " + port + " already in use", Color.ORANGE);
      log.writeToLog("Port " + port + " already in use");
      closeStreams();
    } catch (IOException e) {
      gui.setLabel("Trouble with ServerSocket creation on port " + port + ": " + e, Color.RED);
      gui.setTextArea1("Trouble with ServerSocket creation on port " + port, Color.ORANGE);
      log.writeToLog("Trouble with ServerSocket creation on port " + port);
    }
  } // End constructor
 // set up streams for communicating with the client
 protected void openStreams() throws IOException {
   streamsOpen = true;
   final boolean AUTO_FLUSH = true;
   is = socket.getInputStream();
   fromClient = new BufferedReader(new InputStreamReader(is));
   os = socket.getOutputStream();
   toClient = new PrintWriter(os, AUTO_FLUSH);
   gui.setTextArea1("Streams Open ", Color.ORANGE);
   log.writeToLog("Streams Open ");
   // System.out.println("Streams Open ");
 }
  public void closeStreams() {
    try {
      if (getStreamsOpen()) {
        toClient.close();
        os.close();
        fromClient.close();
        is.close();

        gui.setLabel("...Streams closed down", Color.RED);
        log.writeToLog("...Streams closed down");
        streamsOpen = false;
        socket.close();
        setDisconnected();
      }
    } catch (IOException e) {
      gui.setLabel("Could not close streams", Color.RED);
      gui.setTextArea1("Could not close streams", Color.ORANGE);
      log.writeToLog("Could not close streams");
    }
  }
  /** @throws IOException */
  public void processClientRequests() throws IOException {
    byte[] receivedByteArray = new byte[1025];
    String stringReceivedByteArray = "";
    int iBytesAvailable = 0;
    int iBytesRead = 0;
    boolean bOk = true;
    while (bOk) {
      iBytesAvailable = is.available();
      if (iBytesAvailable > 0) {
        iBytesRead = is.read(receivedByteArray); // Get next request
        byte[] bytesReadArray = new byte[iBytesRead];
        for (int i = 0; i < iBytesRead; i++) {
          stringReceivedByteArray =
              stringReceivedByteArray + String.valueOf(receivedByteArray[i]) + " ";
          bytesReadArray[i] = receivedByteArray[i];
        }
        String ascii = new String(bytesReadArray, "US-ASCII");
        String subascii = ascii.substring(1, bytesReadArray.length - 1);

        // if recieve <STX>02F0D8<CR> Dip switch 0 read (Left or Right)
        if ((receivedByteArray[0] == 2
                && receivedByteArray[1] == 48
                && receivedByteArray[2] == 50
                && receivedByteArray[3] == 70
                && receivedByteArray[4] == 48)
            || (receivedByteArray[0] == 48
                && receivedByteArray[1] == 50
                && receivedByteArray[2] == 70
                && receivedByteArray[3] == 48
                && receivedByteArray[4] == 68)) {
          sReplyDescription = "(Dip Switch 0 Read (right or left) )";
          if (!gui.getStatusSuppression()) {
            gui.setTextArea1(subascii + " " + sReplyDescription, Color.DARK_GRAY);
            log.writeToLog(subascii + " " + sReplyDescription);
          }
          leftRight = gui.getVariant();
          ;
          switch (leftRight) {
            case "T50L":
              variantReply = "6P";
              break;
            case "T50R":
              variantReply = "6P";
              break;
            case "T60L":
              variantReply = "6P";
              break;
            case "T60R":
              variantReply = "6P";
              break;
          }
          sReply0 = "0A2F" + "6P" + "??";
          // sReply0 = "0A2F" + leftRightBinary + "??";
          byte[] br0 = new byte[sReply0.length() + 2];
          byte[] blah = sReply0.getBytes();
          br0[0] = 1;
          for (int i = 0; i < blah.length; i++) {
            br0[i + 1] = blah[i];
          }
          br0[blah.length + 1] = 13;

          os.write(br0);
          if (!gui.getStatusSuppression()) {
            String asciibr1 = new String(br0, "US-ASCII");
            gui.setTextArea1(asciibr1 + " Dip Switch Read 0 - " + "RightPrinter" + ")", Color.GRAY);
            log.writeToLog(asciibr1 + " Dip Switch Read 0 - " + "RightPrinter" + ")");
            // gui.setTextArea1(asciibr1 + " Dip Switch Read 0 - " + variantAnswer +
            // ")",Color.GRAY);
            // log.writeToLog(asciibr1 + " Dip Switch Read 0 - " + variantAnswer + ")");
          }
        }

        // if recieve <STX>02F1D9<CR> Dip switch 1 read (Dots)
        else if ((receivedByteArray[0] == 2
                && receivedByteArray[1] == 48
                && receivedByteArray[2] == 50
                && receivedByteArray[3] == 70
                && receivedByteArray[4] == 49)
            || (receivedByteArray[0] == 48
                && receivedByteArray[1] == 50
                && receivedByteArray[2] == 70
                && receivedByteArray[3] == 49)) {
          sReplyDescription = "(Dip Switch 1 Read)";
          if (!gui.getStatusSuppression()) {
            gui.setTextArea1(subascii + " " + sReplyDescription, Color.DARK_GRAY);
            log.writeToLog(subascii + " " + sReplyDescription);
          }
          sDots = gui.getDots();
          switch (sDots) {
            case "6 Dot":
              sDotReply = "<0";
              break;
            case "8 Dot":
              sDotReply = "<0";
              break;
            case "12 Dot":
              sDotReply = "<0";
              break;
          }
          sReply1 = "0A2F" + "<0" + "??";
          byte[] br1 = new byte[sReply1.length() + 2];
          byte[] blah = sReply1.getBytes();
          br1[0] = 1;
          for (int i = 0; i < blah.length; i++) {
            br1[i + 1] = blah[i];
          }
          br1[blah.length + 1] = 13;

          os.write(br1);
          if (!gui.getStatusSuppression()) {
            String asciibr1 = new String(br1, "US-ASCII");
            gui.setTextArea1(asciibr1 + " Dip Switch Read 1 - " + sDots + ")", Color.GRAY);
            log.writeToLog(asciibr1 + " Dip Switch Read 1 - " + sDots + ")");
          }
        }

        // if recieve <STX>02F7615<CR> Check print head width
        else if ((receivedByteArray[0] == 2
                && receivedByteArray[1] == 48
                && receivedByteArray[2] == 50
                && receivedByteArray[3] == 70
                && receivedByteArray[4] == 55)
            || (receivedByteArray[0] == 48
                && receivedByteArray[1] == 50
                && receivedByteArray[2] == 70
                && receivedByteArray[3] == 55
                && receivedByteArray[4] == 54)) {
          sReplyDescription = "(Check Print Head Width)";
          if (!gui.getStatusSuppression()) {
            gui.setTextArea1(subascii + " " + sReplyDescription, Color.DARK_GRAY);
            log.writeToLog(subascii + " " + sReplyDescription);
          }
          sReply7 = "0A2F" + sWidth + "??";
          byte[] br7 = new byte[sReply7.length() + 2];
          byte[] blah = sReply7.getBytes();
          br7[0] = 1;
          for (int i = 0; i < blah.length; i++) {
            br7[i + 1] = blah[i];
          }
          br7[blah.length + 1] = 13;

          os.write(br7);
          if (!gui.getStatusSuppression()) {
            String asciibr1 = new String(br7, "US-ASCII");
            gui.setTextArea1(asciibr1 + " Print Head Width - " + sWidth + ")", Color.GRAY);
            log.writeToLog(asciibr1 + " Print Head Width - " + sWidth + ")");
          }
        }

        // if recieve <STX>02F9516<CR> Read Dip Switch 95
        else if ((receivedByteArray[0] == 2
                && receivedByteArray[1] == 48
                && receivedByteArray[2] == 50
                && receivedByteArray[3] == 70
                && receivedByteArray[4] == 57
                && receivedByteArray[5] == 53)
            || (receivedByteArray[0] == 48
                && receivedByteArray[1] == 50
                && receivedByteArray[2] == 70
                && receivedByteArray[3] == 57
                && receivedByteArray[4] == 53)) {
          sReplyDescription = "(Read Dip Switch 95)";
          if (!gui.getStatusSuppression()) {
            gui.setTextArea1(subascii + " " + sReplyDescription, Color.DARK_GRAY);
            log.writeToLog(subascii + " " + sReplyDescription);
          }
          sReply6 = "0A2F" + "00" + "??";
          byte[] br6 = new byte[sReply6.length() + 2];
          byte[] blah = sReply6.getBytes();
          br6[0] = 1;
          for (int i = 0; i < blah.length; i++) {
            br6[i + 1] = blah[i];
          }
          br6[blah.length + 1] = 13;

          os.write(br6);
          if (!gui.getStatusSuppression()) {
            String asciibr1 = new String(br6, "US-ASCII");
            gui.setTextArea1(asciibr1 + " Read Dip Switch 95", Color.GRAY);
            log.writeToLog(asciibr1 + " Read Dip Switch 95");
          }
        }

        // if recieve <STX>02F9617<CR> Read Dip Switch 96
        else if ((receivedByteArray[0] == 2
                && receivedByteArray[1] == 48
                && receivedByteArray[2] == 50
                && receivedByteArray[3] == 70
                && receivedByteArray[4] == 57
                && receivedByteArray[5] == 54)
            || (receivedByteArray[0] == 48
                && receivedByteArray[1] == 50
                && receivedByteArray[2] == 70
                && receivedByteArray[3] == 57
                && receivedByteArray[4] == 54)) {
          sReplyDescription = "(Read Dip Switch 96)";
          if (!gui.getStatusSuppression()) {
            gui.setTextArea1(subascii + " " + sReplyDescription, Color.DARK_GRAY);
            log.writeToLog(subascii + " " + sReplyDescription);
          }
          sReply8 = "0A2F" + "50" + "??";
          byte[] br8 = new byte[sReply8.length() + 2];
          byte[] blah = sReply8.getBytes();
          br8[0] = 1;
          for (int i = 0; i < blah.length; i++) {
            br8[i + 1] = blah[i];
          }
          br8[blah.length + 1] = 13;

          os.write(br8);
          if (!gui.getStatusSuppression()) {
            String asciibr1 = new String(br8, "US-ASCII");
            gui.setTextArea1(asciibr1 + " Read Dip Switch 96", Color.GRAY);
            log.writeToLog(asciibr1 + " Read Dip Switch 96");
          }
        }

        // if recieve <STX>00090<CR> Read printer Status
        else if (receivedByteArray[0] == 48
            && receivedByteArray[1] == 48
            && receivedByteArray[2] == 48
            && receivedByteArray[3] == 57
            && receivedByteArray[4] == 48) {
          sReplyDescription = "(Printer Status Check)";
          if (!gui.getStatusSuppression()) {
            gui.setTextArea1(subascii + " " + sReplyDescription, Color.DARK_GRAY);
            log.writeToLog(subascii + " " + sReplyDescription);
          }

          sMSeriesErrorCode3 = gui.getMSeriesErrorCode();
          switch (sMSeriesErrorCode3) {
            case "999":
              sMSeriesErrorCodeText = "Printer Ready (no errors)";
              break;
            case "801":
              sMSeriesErrorCodeText = "Print Head Up";
              break;
            case "802":
              sMSeriesErrorCodeText = "Print Head Overheating";
              break;
            case "803":
              sMSeriesErrorCodeText = "Warning - Low level labels";
              break;
            case "804":
              sMSeriesErrorCodeText = "Warning - Low level film";
              break;
            case "805":
              sMSeriesErrorCodeText = "No labels";
              break;
            case "806":
              sMSeriesErrorCodeText = "No film";
              break;
            case "807":
              sMSeriesErrorCodeText = "5 volt to print head missing";
              break;
            case "808":
              sMSeriesErrorCodeText = "24 volt to print head missing";
              break;
            case "809":
              sMSeriesErrorCodeText = "36 volt to stepper motor missing";
              break;
            case "810":
              sMSeriesErrorCodeText = "ACC (Applicator Control Card) Error";
              break;
            case "812":
              sMSeriesErrorCodeText = "Bar-code not readable";
              break;
            case "813":
              sMSeriesErrorCodeText =
                  "F20: No printout or no ribbon has been detected by the extra sensor";
              break;
            case "814":
              sMSeriesErrorCodeText = "F20: Print head is down in the wrong occasion";
              break;
            case "815":
              sMSeriesErrorCodeText = "F20: Print head is up in the wrong occasion";
              break;
            case "994":
              sMSeriesErrorCodeText = "Printing ready, application in progress.";
              break;
            case "995":
              sMSeriesErrorCodeText =
                  "Printer interrupted by head up, print head overheat no labels or no film.";
              break;
            case "996":
              sMSeriesErrorCodeText = "Special";
              break;
            case "997":
              sMSeriesErrorCodeText = "Reset in progress (Command 01 or 02)";
              break;
            case "998":
              sMSeriesErrorCodeText = "Printing in progress";
              break;
          }
          sReply2 = "0A00" + sMSeriesErrorCode3 + "??";
          byte[] br2 = new byte[sReply2.length() + 2];
          byte[] blah = sReply2.getBytes();
          br2[0] = 1;
          for (int i = 0; i < blah.length; i++) {
            br2[i + 1] = blah[i];
          }
          br2[blah.length + 1] = 13;
          os.write(br2);

          if (!gui.getStatusSuppression()) {
            String asciibr2 = new String(br2, "UTF-8");
            gui.setTextArea1(
                asciibr2 + " (" + sMSeriesErrorCode3 + " " + sMSeriesErrorCodeText + ")",
                Color.GRAY); // 0A009997C - 999 Printer ready (no errors)
            log.writeToLog(
                asciibr2 + " (" + sMSeriesErrorCode3 + " " + sMSeriesErrorCodeText + ")");
          }
        }
        // if recieve <STX>03699<CR> Get counters
        else if ((receivedByteArray[0] == 2
                && receivedByteArray[1] == 48
                && receivedByteArray[2] == 51
                && receivedByteArray[3] == 54
                && receivedByteArray[4] == 57
                && receivedByteArray[5] == 57)
            || (receivedByteArray[0] == 48
                && receivedByteArray[1] == 51
                && receivedByteArray[2] == 54
                && receivedByteArray[3] == 57
                && receivedByteArray[4] == 57)) {
          sReplyDescription = "(Get Counters)";
          if (!gui.getStatusSuppression()) {
            gui.setTextArea1(subascii + " " + sReplyDescription, Color.DARK_GRAY);
            log.writeToLog(subascii + " " + sReplyDescription);
          }
          printCount = gui.getPrintCount();
          if ("".equals(printCount)) {
            printCount = "0";
          }
          String countValue = bc.convertValue(printCount);
          sReply3a = "0A36" + countValue;
          // sReply3b = "0000505É";
          sReply3b = "0000" + countValue;
          // sReply3c = "0000:07P??";
          sReply3c = "0000" + countValue + "??";
          byte[] br3 =
              new byte[1 + sReply3a.length() + 1 + sReply3b.length() + 1 + sReply3c.length() + 1];
          byte[] blah1 = sReply3a.getBytes("Cp437");
          br3[0] = 1;
          for (int i = 0; i < blah1.length; i++) {
            br3[i + 1] = blah1[i];
          }
          br3[blah1.length + 1] = 10;
          byte[] blah2 = sReply3b.getBytes("Cp437");
          for (int i = 0; i < blah2.length; i++) {
            br3[i + 10] = blah2[i];
          }
          br3[blah1.length + 2 + blah2.length] = 10;
          byte[] blah3 = sReply3c.getBytes("Cp437");
          for (int i = 0; i < blah3.length; i++) {
            br3[i + 19] = blah3[i];
          }
          br3[blah1.length + 1 + blah2.length + 2 + blah3.length] = 13;

          os.write(br3);

          if (!gui.getStatusSuppression()) {
            String asciibr3 = new String(br3, "Cp437");
            gui.setTextArea1(asciibr3 + " (ACK)", Color.GRAY); // ACK
            log.writeToLog(asciibr3 + " (ACK)");
          }
        }

        // if recieve <STX>01596<CR> Read Date and Time
        else if ((receivedByteArray[0] == 2
                && receivedByteArray[1] == 48
                && receivedByteArray[2] == 49
                && receivedByteArray[3] == 53
                && receivedByteArray[4] == 57)
            || (receivedByteArray[0] == 48
                && receivedByteArray[1] == 49
                && receivedByteArray[2] == 53
                && receivedByteArray[3] == 57)) {
          sReplyDescription = "(Read Date and Time)";
          if (!gui.getStatusSuppression()) {
            gui.setTextArea1(subascii + " " + sReplyDescription, Color.DARK_GRAY);
            log.writeToLog(subascii + " " + sReplyDescription);
          }
          DateFormat df2 = new SimpleDateFormat("yyMMddHHmm");
          sReply4 = "0A15" + df2.format(new Date()) + "??";
          byte[] br4 = new byte[sReply4.length() + 2];
          byte[] blah = sReply4.getBytes();
          br4[0] = 1;
          for (int i = 0; i < blah.length; i++) {
            br4[i + 1] = blah[i];
          }
          br4[blah.length + 1] = 13;

          os.write(br4);

          if (!gui.getStatusSuppression()) {
            String asciibr4 = new String(br4, "US-ASCII");
            DateFormat df3 = new SimpleDateFormat("yyMMdd");
            DateFormat df4 = new SimpleDateFormat("HHmm");
            gui.setTextArea1(
                asciibr4
                    + " (Date "
                    + df3.format(new Date())
                    + " and Time "
                    + df4.format(new Date())
                    + ")",
                Color.GRAY); // 0A15yyMMddHHmm??
            log.writeToLog(
                asciibr4
                    + " (Date "
                    + df3.format(new Date())
                    + " and Time "
                    + df4.format(new Date())
                    + ")");
          }
        }

        // if recieve <STX>044B??<CR> Set Pause Time to 66
        else if ((receivedByteArray[0] == 48
                && receivedByteArray[1] == 52
                && receivedByteArray[2] == 52
                && receivedByteArray[3] == 66)
            || (receivedByteArray[0] == 2
                && receivedByteArray[1] == 48
                && receivedByteArray[2] == 52
                && receivedByteArray[3] == 52
                && receivedByteArray[4] == 66)) {
          sReplyDescription = "(Set Pause Time to 66)";
          if (!gui.getStatusSuppression()) {
            gui.setTextArea1(subascii + " " + sReplyDescription, Color.DARK_GRAY);
            log.writeToLog(subascii + " " + sReplyDescription);
          }
          sReply5 = "0A440000000000??";
          byte[] br5 = new byte[sReply5.length() + 2];
          byte[] blah = sReply5.getBytes();
          br5[0] = 1;
          for (int i = 0; i < blah.length; i++) {
            br5[i + 1] = blah[i];
          }
          br5[blah.length + 1] = 13;

          os.write(br5);

          if (!gui.getStatusSuppression()) {
            String asciibr5 = new String(br5, "US-ASCII");
            gui.setTextArea1(asciibr5 + " (ACK)", Color.GRAY); // ACK
            log.writeToLog(asciibr5 + " (ACK)");
          }
        }
        // ACK
        else {
          sReplyDescription = "(Command)";
          gui.setTextArea1(subascii + " " + sReplyDescription, Color.RED);
          log.writeToLog(subascii + " " + sReplyDescription);
          int brLength = bytesReadArray.length;
          brLength = brLength + 2;
          byte[] br6 = new byte[brLength];
          br6[0] = 1;
          br6[1] = 48;
          br6[2] = 65;
          br6[3] = bytesReadArray[2];
          br6[4] = bytesReadArray[3];
          for (int i = 5; i < br6.length - 3; i++) {
            br6[i] = bytesReadArray[i - 1];
          }
          br6[brLength - 3] = 63;
          br6[brLength - 2] = 63;
          br6[brLength - 1] = 13;

          os.write(br6);

          String asciibr6 = new String(br6, "US-ASCII");
          gui.setTextArea1(asciibr6 + " (ACK)", Color.BLUE); // ACK
          log.writeToLog(asciibr6 + " (ACK)");
        }
        stringReceivedByteArray = "";
      } else {
        int i = is.read();
        if (-1 == i) {
          closeStreams();
          bOk = false;
        }
      }
    }
  }