У меня есть следующий код ChatClien.java: package org.example;

import java.io.;
import java.net.;
import java.util.Scanner;

public class ChatClient {
private static final String SERVER_ADDRESS = "localhost";
private static final int SERVER_PORT = 12345;


public static void main(String[] args) {
    try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
         PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
         Scanner scanner = new Scanner(System.in)) {

        // Получаем запрос на имя
        String serverResponse = in.readLine();
        System.out.println(serverResponse); // Показываем запрос на имя клиенту

        // Вводим никнейм
        String nickname = scanner.nextLine().trim();
        out.println(nickname);  // Отправляем имя на сервер

        // Ожидаем ответа от сервера
        serverResponse = in.readLine();
        System.out.println(serverResponse);  // Если авторизация прошла, выводим приветствие или ошибку

        // Переходим к меню
        showMenu();

        // Обработка выбора в меню
        String choice;
        while (true) {
            System.out.print("Выберите действие: ");
            choice = scanner.nextLine().trim();
            out.println(choice);

            // Обработка сообщений от сервера
            serverResponse = in.readLine();
            System.out.println(serverResponse); // Выводим ответ сервера

            if (choice.equals("5")) {
                break; // Выход из программы
            }

            // Если клиент в комнате, отправляем сообщение
            if (choice.equals("4")) {
                sendMessage(scanner, out);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static void showMenu() {
    System.out.println("\nГлавное меню:");
    System.out.println("1. Создать новую комнату");
    System.out.println("2. Присоединиться к комнате");
    System.out.println("3. Покинуть комнату");
    System.out.println("4. Отправить сообщение в комнату");
    System.out.println("5. Выйти");
}

private static void createRoom(Scanner scanner, PrintWriter out) {
    System.out.print("Введите название комнаты: ");
    String roomName = scanner.nextLine().trim();
    out.println("createRoom " + roomName);
}

private static void joinRoom(Scanner scanner, PrintWriter out) {
    System.out.print("Введите название комнаты для присоединения: ");
    String roomName = scanner.nextLine().trim();
    out.println("joinRoom " + roomName);
}

private static void leaveRoom(PrintWriter out) {
    out.println("leaveRoom");
}

private static void sendMessage(Scanner scanner, PrintWriter out) {
    System.out.print("Введите сообщение: ");
    String message = scanner.nextLine();
    out.println("message " + message);
}
} ChatProxy.java: package org.example;

import java.io.;
import java.net.;
import java.util.Arrays;
import java.util.List;

public class ChatProxy {
private static final int PROXY_PORT = 12346;
private static final String SERVER_ADDRESS = "localhost";
private static final int SERVER_PORT = 12345;


private static final List<String> BAD_WORDS = Arrays.asList("Артем", "ужас", "плохой", "гадость");

public static void main(String[] args) {
    try (ServerSocket proxySocket = new ServerSocket(PROXY_PORT)) {
        System.out.println("Прокси-сервер запущен на порту " + PROXY_PORT);

        while (true) {
            Socket clientSocket = proxySocket.accept();
            new Thread(new ProxyHandler(clientSocket)).start();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static class ProxyHandler implements Runnable {
    private Socket clientSocket;

    public ProxyHandler(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }

    @Override
    public void run() {
        try (Socket serverSocket = new Socket(SERVER_ADDRESS, SERVER_PORT);
             BufferedReader clientIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
             PrintWriter clientOut = new PrintWriter(clientSocket.getOutputStream(), true);
             BufferedReader serverIn = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
             PrintWriter serverOut = new PrintWriter(serverSocket.getOutputStream(), true)) {

            String nickname = clientIn.readLine().trim();
            serverOut.println(nickname);

            String serverResponse = serverIn.readLine();
            clientOut.println(serverResponse);

            new Thread(() -> {
                try {
                    String message;
                    while ((message = clientIn.readLine()) != null) {
                        String filteredMessage = filterBadWords(message);
                        serverOut.println(filteredMessage);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();

            String serverMessage;
            while ((serverMessage = serverIn.readLine()) != null) {
                clientOut.println(serverMessage);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String filterBadWords(String message) {
        for (String badWord : BAD_WORDS) {
            message = message.replaceAll("(?i)" + badWord, "***");
        }
        return message;
    }
}
} ChatServer.java: package org.example;

import java.io.;
import java.net.;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

public class ChatServer {
private static final int PORT = 12345;
private static Map<String, ClientHandler> clients = new HashMap<>(); // Хранение всех клиентов
private static Map<String, ChatRoom> rooms = new HashMap<>(); // Хранение комнат


public static void main(String[] args) {
    try (ServerSocket serverSocket = new ServerSocket(PORT)) {
        System.out.println("Сервер запущен на порту " + PORT);

        while (true) {
            Socket socket = serverSocket.accept();
            ClientHandler clientHandler = new ClientHandler(socket);
            new Thread(clientHandler).start();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static void broadcastMessage(String message, String roomName) {
    ChatRoom room = rooms.get(roomName);
    if (room != null) {
        room.broadcast(message);
    }
}

public static void removeClient(ClientHandler clientHandler) {
    clients.remove(clientHandler.nickname);
}

public static void createRoom(String roomName) {
    rooms.putIfAbsent(roomName, new ChatRoom(roomName));
}

public static void listRooms(ClientHandler clientHandler) {
    if (rooms.isEmpty()) {
        clientHandler.sendMessage("Нет доступных комнат.");
    } else {
        clientHandler.sendMessage("Доступные комнаты:");
        int index = 1;
        for (String roomName : rooms.keySet()) {
            clientHandler.sendMessage(index + ". " + roomName);
            index++;
        }
    }
}

public static class ChatRoom {
    private String name;
    private List<ClientHandler> members = new CopyOnWriteArrayList<>();

    public ChatRoom(String name) {
        this.name = name;
    }

    public void addMember(ClientHandler clientHandler) {
        members.add(clientHandler);
    }

    public void removeMember(ClientHandler clientHandler) {
        members.remove(clientHandler);
    }

    public void broadcast(String message) {
        for (ClientHandler client : members) {
            client.sendMessage(message);
        }
    }

    public List<ClientHandler> getMembers() {
        return members;
    }

    public String getName() {
        return name;
    }
}

public static class ClientHandler implements Runnable {
    private Socket socket;
    private BufferedReader in;
    private PrintWriter out;
    private String nickname;
    private String currentRoom;

    public ClientHandler(Socket socket) {
        this.socket = socket;
        try {
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            // Этап регистрации и авторизации
            out.println("Введите ваше имя:");
            while (true) {
                nickname = in.readLine().trim();

                if (clients.containsKey(nickname)) {
                    out.println("Это имя уже занято, попробуйте другое.");
                } else {
                    clients.put(nickname, this);
                    out.println("Регистрация прошла успешно! Добро пожаловать, " + nickname + "!");
                    break;
                }
            }

            // Главное меню
            showMenu();

            String choice;
            while (true) {
                choice = in.readLine().trim();
                switch (choice) {
                    case "1":
                        createRoom();
                        break;
                    case "2":
                        joinRoom();
                        break;
                    case "3":
                        leaveRoom();
                        break;
                    case "4":
                        sendMessageToRoom();
                        break;
                    case "5":
                        out.println("Выход из чата...");
                        return;
                    default:
                        out.println("Неверный выбор, попробуйте снова.");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            removeClient(this);
            if (currentRoom != null) {
                ChatRoom room = rooms.get(currentRoom);
                if (room != null) {
                    room.removeMember(this);
                }
            }
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void showMenu() {
        out.println("\nГлавное меню:");
        out.println("1. Создать новую комнату");
        out.println("2. Присоединиться к комнате");
        out.println("3. Покинуть комнату");
        out.println("4. Отправить сообщение в комнату");
        out.println("5. Выйти");
        out.print("Выберите действие: ");
    }

    private void createRoom() {
        out.print("Введите название комнаты: ");
        try {
            String roomName = in.readLine().trim();
            if (!rooms.containsKey(roomName)) {
                ChatServer.createRoom(roomName);
                rooms.get(roomName).addMember(this);
                currentRoom = roomName;
                out.println("Комната \"" + roomName + "\" создана и вы в нее вошли.");
                startChat();
            } else {
                out.println("Комната с таким именем уже существует.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void joinRoom() {
        out.println("Список доступных комнат:");
        ChatServer.listRooms(this);
        out.print("Введите номер комнаты для присоединения: ");
        try {
            int roomNumber = Integer.parseInt(in.readLine().trim());
            String roomName = getRoomNameByNumber(roomNumber);
            if (roomName != null) {
                ChatRoom room = rooms.get(roomName);
                room.addMember(this);
                currentRoom = roomName;
                out.println("Вы присоединились к комнате \"" + roomName + "\".");
                startChat();
            } else {
                out.println("Некорректный номер комнаты.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String getRoomNameByNumber(int roomNumber) {
        int index = 1;
        for (String roomName : rooms.keySet()) {
            if (index == roomNumber) {
                return roomName;
            }
            index++;
        }
        return null;
    }

    private void startChat() {
        out.println("Введите сообщения. Для выхода нажмите 0.");
        try {
            while (true) {
                String message = in.readLine().trim();
                if ("0".equals(message)) {
                    leaveRoom();
                    break;
                } else if (!message.isEmpty()) {
                    ChatServer.broadcastMessage(nickname + ": " + message, currentRoom);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void leaveRoom() {
        if (currentRoom != null) {
            ChatRoom room = rooms.get(currentRoom);
            room.removeMember(this);
            out.println("Вы покинули комнату \"" + currentRoom + "\".");
            currentRoom = null;
        } else {
            out.println("Вы не находитесь в комнате.");
        }
    }

    private void sendMessageToRoom() {
        if (currentRoom != null) {
            out.print("Введите сообщение: ");
            try {
                String message = in.readLine();
                if (!message.isEmpty()) {
                    ChatServer.broadcastMessage(nickname + ": " + message, currentRoom);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            out.println("Вы не находитесь в комнате.");
        }
    }

    public void sendMessage(String message) {
        out.println(message);
    }
}
} Отредактирую его таким образом, чтобы главное меню исправно работало, при выбора пункта присоединится к группе выводился список групп и можно было цифрой, как в меню, выбрать группу. Находясь в группе можно писать сообщения и они должны отсылась всем клиентам в той же группе