title: Knock Knock application with server and UI
body: <p>I am creating a simple Knock Knock application (socket programming) where there is a localhost server and there is a client.the program is simple, the server will tell the knock knock jokes, this is how it's supposed to go,</p>
  
  <pre><code>Server: Knock Knock
  Client: Who's there?
  Server: Turnip.
  Client: Turnip Who?
  Server: Turnip the heat.
  </code></pre>
  
  <p>So that's how the program supposed to go. but the thing is my GUI doesn't show any messages. on my Text area. Here are my codes.</p>
  
  <p>The Server:</p>
  
  <pre><code>import java.net.*;
  import java.io.*;
  
  public class KnockKnockServer {
      public static void main(String[] args) throws IOException {
  
          ServerSocket serverSocket = null;
          try {
              serverSocket = new ServerSocket(4444);
          } catch (IOException e) {
              System.err.println("Could not listen on port: 4444.");
              System.exit(1);
          }
  
          Socket clientSocket = null;
          try {
              clientSocket = serverSocket.accept();
          } catch (IOException e) {
              System.err.println("Accept failed.");
              System.exit(1);
          }
  
          PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
          BufferedReader in = new BufferedReader(
                  new InputStreamReader(
                  clientSocket.getInputStream()));
          String inputLine, outputLine;
          KnockKnockProtocol kkp = new KnockKnockProtocol();
  
          outputLine = kkp.processInput(null);
          out.println(outputLine);
  
          while ((inputLine = in.readLine()) != null) {
               outputLine = kkp.processInput(inputLine);
               out.println(outputLine);
               if (outputLine.equals("Bye."))
                  break;
          }
          out.close();
          in.close();
          clientSocket.close();
          serverSocket.close();
      }
  }
  </code></pre>
  
  <p>The KnockKnockProtocol</p>
  
  <pre><code>import java.net.*;
  import java.io.*;
  
  public class KnockKnockProtocol {
      private static final int WAITING = 0;
      private static final int SENTKNOCKKNOCK = 1;
      private static final int SENTCLUE = 2;
      private static final int ANOTHER = 3;
  
      private static final int NUMJOKES = 5;
  
      private int state = WAITING;
      private int currentJoke = 0;
  
      private String[] clues = { "Turnip", "Little Old Lady", "Atch", "Who", "Who" };
      private String[] answers = { "Turnip the heat, it's cold in here!",
                                   "I didn't know you could yodel!",
                                   "Bless you!",
                                   "Is there an owl in here?",
                                   "Is there an echo in here?" };
  
      public String processInput(String theInput) {
          String theOutput = null;
  
          if (state == WAITING) {
              theOutput = "Knock! Knock!";
              state = SENTKNOCKKNOCK;
          } else if (state == SENTKNOCKKNOCK) {
              if (theInput.equalsIgnoreCase("Who's there?")) {
                  theOutput = clues[currentJoke];
                  state = SENTCLUE;
              } else {
                  theOutput = "You're supposed to say \"Who's there?\"! " +
                  "Try again. Knock! Knock!";
              }
          } else if (state == SENTCLUE) {
              if (theInput.equalsIgnoreCase(clues[currentJoke] + " who?")) {
                  theOutput = answers[currentJoke] + " Want another? (y/n)";
                  state = ANOTHER;
              } else {
                  theOutput = "You're supposed to say \"" + 
                  clues[currentJoke] + 
                  " who?\"" + 
                  "! Try again. Knock! Knock!";
                  state = SENTKNOCKKNOCK;
              }
          } else if (state == ANOTHER) {
              if (theInput.equalsIgnoreCase("y")) {
                  theOutput = "Knock! Knock!";
                  if (currentJoke == (NUMJOKES - 1))
                      currentJoke = 0;
                  else
                      currentJoke++;
                  state = SENTKNOCKKNOCK;
              } else {
                  theOutput = "Bye.";
                  state = WAITING;
              }
          }
          return theOutput;
      }
  }
  </code></pre>
  
  <p>The Client.</p>
  
  <pre><code>import java.io.*;
  import java.net.*;
  
  
  public class KnockKnockClient {
  
      public String fromServer;
      public String fromUser;
  
      public void Client() throws IOException {
  
          Socket kkSocket = null;
          PrintWriter out = null;
          BufferedReader in = null;
  
  
          try {
              kkSocket = new Socket("127.0.0.1", 4444);
              out = new PrintWriter(kkSocket.getOutputStream(), true);
              in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
          } catch (UnknownHostException e) {
              System.err.println("Don't know about host: 127.0.0.1");
              System.exit(1);
          } catch (IOException e) {
              System.err.println("Couldn't get I/O for the connection to: 127.0.0.1");
              System.exit(1);
          }
  
          BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
  
          while ((fromServer = in.readLine()) != null) {
              System.out.println("Server: " + fromServer);
  
              if (fromServer.equals("Bye."))
                  break;
  
              fromUser = stdIn.readLine();
          if (fromUser != null) {
                  System.out.println("Client: " + fromUser);
                  out.println(fromUser);
          }
          }
  
          out.close();
          in.close();
          stdIn.close();
          kkSocket.close();
      }
  
  
  }
  </code></pre>
  
  <p>And The UI</p>
  
  <pre><code> import java.awt.event.ActionListener;
  
  
  
      public class KnockKnockWindow extends JFrame {
  
          JTextArea clientTextArea;
          JTextArea serverTextArea;
          JButton submitButton;
  
  
          public KnockKnockWindow() {
  
              super("Chat Window");
              setVisible(true);
              setDefaultCloseOperation(EXIT_ON_CLOSE);
              setLocationRelativeTo(null);
              setSize(420,228);
  
              getContentPane().setLayout(null);
  
              clientTextArea = new JTextArea();
              clientTextArea.setBounds(10, 118, 278, 51);
              getContentPane().add(clientTextArea);
  
  
              serverTextArea = new JTextArea();
              serverTextArea.setBounds(10, 11, 278, 96);
              getContentPane().add(serverTextArea);
  
              submitButton = new JButton("Submit");
              submitButton.setBounds(298, 118, 89, 51);
              getContentPane().add(submitButton);
          }
  
  
          public void setServerText(String fromServer){
              serverTextArea.setText(fromServer);
          }
  
          public void setClientText(String fromClient){
              clientTextArea.setText(fromClient);
          }
  
          public String returnClientText(){
              return clientTextArea.getText();
          }
  
          public void addSubmitListener(ActionListener sub){
              submitButton.addActionListener(sub);
          }
  
      }   
  
  
  
  The Controller
  
  
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  
  
  public class KnockKnockController {
  
      private KnockKnockClient client;
      private KnockKnockWindow window;
  
      public KnockKnockController(KnockKnockClient client, KnockKnockWindow window){
          this.client = client;
          this.window = window;
  
          window.addSubmitListener(new SubmitListener());
          window.setServerText(client.fromServer);
      }
  
      public class SubmitListener implements ActionListener{
  
          public void actionPerformed(ActionEvent arg0) {
              client.fromUser = window.returnClientText();
          }
      }
  }
  </code></pre>
  
  <p>And the Main Application</p>
  
  <pre><code>import javax.swing.JFrame;
  
  public class KnockTest extends JFrame{
  
      public static void main (String[] args){
          KnockKnockClient kkcl = new KnockKnockClient();
          KnockKnockWindow kkw = new KnockKnockWindow();
          KnockKnockController kkc = new KnockKnockController(kkcl,kkw);
      }
  }
  </code></pre>
  
  <p>We will run the server first, then the main.</p>
  
  <p>But why is it that I am not receiving any messages from the server? when I click start. The text area of the Server should say KnockKnock. but it appears it is not showing, any idea? sorry for the long code post, but  I do not know to shorten them here. since I know most of them are important</p>