Валидатор задачу принял. В итоге когда я ввел порт, локалхост, у меня запросили имя. В итоге я ввел имя и мне выдало исключение. В чем прикол всего этого? Кидает исключение Unexpected Message Type. Помогите решить проблему, а то дальше не пройду…
public class Client {
    protected Connection connection;
    private volatile boolean clientConnected = false;

    public static void main(String[] args) {
        Client client = new Client();
        client.run();
    }

    public void run(){
        SocketThread socketThread = getSocketThread();
        socketThread.setDaemon(true);
        socketThread.start();

        synchronized (this){
            try {
                this.wait();
            } catch (InterruptedException e) {
                ConsoleHelper.writeMessage("Error!");
                e.printStackTrace();
            }
        }
        if(clientConnected){
            ConsoleHelper.writeMessage("Соединение установлено. Для выхода наберите команду ‘exit’");

            while (clientConnected){
                String message = ConsoleHelper.readString();
                if(message.equalsIgnoreCase("exit")){
                    break;
                }
                if(shouldSendTextFromConsole()){
                    sendTextMessage(message);
                }
            }

        }else{
            ConsoleHelper.writeMessage("Произошла ошибка во время работы клиента.");
        }

    }

    protected String getServerAddress(){
        System.out.println("Enter server address: ");
        return ConsoleHelper.readString();
    }

    protected int getServerPort(){
        System.out.println("Enter server port: ");
        return ConsoleHelper.readInt();
    }

    protected String getUserName() {
        System.out.println("Enter your name: ");
        return ConsoleHelper.readString();
    }

    protected boolean shouldSendTextFromConsole(){
        return true;
    }

    protected SocketThread getSocketThread(){
        return new SocketThread();
    }

    protected void sendTextMessage(String text){
        try {
            connection.send(new Message(MessageType.TEXT, text));
        } catch (IOException e) {
            clientConnected = false;
            e.printStackTrace();
        }
    }

    public class SocketThread extends Thread{

        @Override
        public void run() {
            try {
                int port = getServerPort();
                String serverAddress = getServerAddress();
                Socket socket = new Socket(serverAddress, port);
                Client.this.connection = new Connection(socket);
                clientHandshake();
                clientMainLoop();
            }catch (IOException | ClassNotFoundException e){
                notifyConnectionStatusChanged(false);
                e.printStackTrace();
            }
        }

        protected void processIncomingMessage(String message){
            ConsoleHelper.writeMessage(message);
        }

        protected void informAboutAddingNewUser(String userName){
            ConsoleHelper.writeMessage(userName + " joined the room");
        }

        protected void informAboutDeletingNewUser(String userName){
            ConsoleHelper.writeMessage(userName + " left the room");
        }

        protected void notifyConnectionStatusChanged(boolean clientConnected){
            Client.this.clientConnected = clientConnected;

            synchronized (Client.this){
                Client.this.notify();
            }
        }

        protected void clientHandshake() throws IOException, ClassNotFoundException{
            while (true){
                Message message = connection.receive();
                if(message.getType() == MessageType.NAME_REQUEST){
                    String name = getUserName();
                    connection.send(new Message(MessageType.USER_NAME, name));
                }

                else if(connection.receive().getType() == MessageType.NAME_ACCEPTED){
                    notifyConnectionStatusChanged(true);
                    return;
                }else throw new IOException("Unexpected MessageType");
            }
        }

        protected void clientMainLoop() throws IOException, ClassNotFoundException{
            while (true){
                Message message = Client.this.connection.receive();
                if(message.getType() == MessageType.TEXT){
                    processIncomingMessage(message.getData());
                }

                else if(message.getType() == MessageType.USER_ADDED){
                    informAboutAddingNewUser(message.getData());
                }

                else if(message.getType() == MessageType.USER_REMOVED){
                    informAboutDeletingNewUser(message.getData());
                }
                else throw new IOException("Unexpected MessageType");
            }
        }

    }
}