Aplicación Knock Knock con servidor y UI

Estoy creando una aplicación simple de Knock Knock (programación de socket) donde hay un servidor localhost y hay un cliente. El programa es simple, el servidor contará los chistes de Knock Knock, así es como se supone que debe ir,

Server: Knock Knock
Client: Who's there?
Server: Turnip.
Client: Turnip Who?
Server: Turnip the heat.

Así es como se suponía que iba el programa. pero la cosa es que mi GUI no muestra ningún mensaje. en mi área de texto. Aquí están mis códigos.

El servidor

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();
    }
}

The KnockKnockProtocol

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;
    }
}

El cliente

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();
    }


}

Y la IU

 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();
        }
    }
}

Y la aplicación principal

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);
    }
}

Primero ejecutaremos el servidor, luego el principal.

Pero, ¿por qué no recibo ningún mensaje del servidor? cuando hago clic en inicio. El área de texto del servidor debe decir KnockKnock. pero parece que no se muestra, ¿alguna idea? perdón por la larga publicación de código, pero no sé acortarlos aquí. ya que sé que la mayoría de ellos son importantes

Respuestas a la pregunta(2)

Su respuesta a la pregunta