/
ProjectEroxa
/
NetworkChat
Обзор
Документация
Войти
/
ProjectEroxa
/
NetworkChat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/chat/server/ClientHandler.java
113 строк
5 KB
Evgeniy Eroshkin
first_commit
07 окт 2025, 16:51
07 окт 2025, 16:51
57192a3
Код
Авторство
О чём код?
package chat.server; import java.io.*; import java.net.*; import chat.common.Logger; /** * Класс для обработки отдельного клиентского подключения * Каждый клиент обслуживается в отдельном потоке */ public class ClientHandler implements Runnable { private Socket socket; // Сокет подключения клиента private ChatServer server; // Ссылка на главный сервер private BufferedReader reader; // Поток для чтения данных от клиента private PrintWriter writer; // Поток для отправки данных клиенту private String username; // Имя пользователя private Logger logger; // Логгер для записи событий /** * Конструктор обработчика клиента * * @param socket сокет подключения клиента * @param server ссылка на сервер */ public ClientHandler(Socket socket, ChatServer server) { this.socket = socket; this.server = server; this.logger = new Logger("server.log"); try { // Инициализируем потоки ввода-вывода reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream(), true); // auto-flush } catch (IOException e) { System.err.println("Ошибка инициализации клиента: " + e.getMessage()); } } /** * Основной метод выполнения в потоке * Обрабатывает сообщения от клиента */ @Override public void run() { try { // Запрашиваем имя пользователя writer.println("Добро пожаловать в чат! Введите ваше имя:"); username = reader.readLine(); // Читаем имя от клиента // Если имя не введено, используем значение по умолчанию if (username == null || username.trim().isEmpty()) { username = "Anonymous"; } // Логируем подключение logger.log("Клиент " + username + " подключился"); // Уведомляем всех о новом пользователе server.broadcastMessage(username + " присоединился к чату!", this); String message; // Читаем сообщения от клиента пока подключение активно while ((message = reader.readLine()) != null) { // Проверяем команду выхода if (message.equalsIgnoreCase("/exit")) { break; } // Рассылаем сообщение всем участникам server.broadcastMessage("[" + username + "]: " + message, this); } } catch (IOException e) { System.err.println("Ошибка клиента " + username + ": " + e.getMessage()); } finally { // Всегда выполняем отключение при выходе disconnect(); } } /** * Отправляет сообщение клиенту * * @param message текст сообщения */ public void sendMessage(String message) { writer.println(message); } /** * Возвращает имя пользователя * * @return имя пользователя */ public String getUsername() { return username; } /** * Корректно отключает клиента */ private void disconnect() { try { // Уведомляем других пользователей о выходе if (username != null) { server.broadcastMessage(username + " покинул чат!", this); } // Закрываем сокет socket.close(); } catch (IOException e) { System.err.println("Ошибка закрытия сокета: " + e.getMessage()); } // Удаляем клиента из списка сервера server.removeClient(this); } }