code: protected void processMessagesOnConnection() {
          try {
              logger.log(INFO, "Connected to " + getConnectionName());
              state.set(StreamState.CONNECTED);
              notifyConnection();
              inputBuffer.flip();
  
              while (!Thread.currentThread().isInterrupted() && isConnected()) {
                  try {
                      // Find the start of message
                      byte byStart = 0;
                      while(byStart != START_OF_MSG && !Thread.currentThread().isInterrupted() && isConnected()) {
                          byStart = nextByte(inputBuffer);
                      }
  
                      // and then make sure there are enough bytes and read the protocol
                      readCompleteMessage(inputBuffer);
                      if(inputBuffer.get() != protocol.getKeyIdentifier()) throw new TcProtocolException("Bad protocol");
  
                      logByteBuffer("Line read from stream", inputBuffer);
  
                      // now we take a shallow buffer copy and process the message
                      MenuCommand mc = protocol.fromChannel(inputBuffer);
                      logger.log(INFO, "Command received: " + mc);
                      notifyListeners(mc);
                  }
                  catch(TcProtocolException ex) {
                      // a protocol problem shouldn't drop the connection
                      logger.log(WARNING, "Probable Bad message reason='{0}' Remote={1} ",
                                 ex.getMessage(), getConnectionName());
                  }
              }
              logger.log(INFO, "Disconnected from " + getConnectionName());
          } catch (Exception e) {
              logger.log(ERROR, "Problem with connectivity on " + getConnectionName(), e);
          }
          finally {
              close();
          }
      }
docs: This is the loop that handles a connection by reading messages until there's an IOException, or the transport
  or thread change to an end state.