/
ProjectEroxa
/
NetworkChat
Обзор
Документация
Войти
/
ProjectEroxa
/
NetworkChat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/chat/client/ChatClient.java
130 строк
6 KB
Evgeniy Eroshkin
first_commit
07 окт 2025, 16:51
07 окт 2025, 16:51
57192a3
Код
Авторство
О чём код?
package chat.client; import chat.common.Logger; import chat.common.Settings; import java.io.*; import java.net.*; import java.util.Scanner; /** * Клиентское приложение для подключения к чату * Обеспечивает отправку и получение сообщений */ public class ChatClient { private String host; // Адрес сервера private int port; // Порт сервера private String username; // Имя пользователя private Socket socket; // Сокет для подключения к серверу private BufferedReader reader; // Поток для чтения данных от сервера private PrintWriter writer; // Поток для отправки данных на сервер private Logger logger; // Логгер для записи событий private boolean connected; // Флаг подключения /** * Конструктор клиента * * @param host адрес сервера * @param port порт сервера */ public ChatClient(String host, int port) { this.host = host; this.port = port; this.logger = new Logger("client.log"); } /** * Подключается к серверу и начинает обмен сообщениями */ public void connect() { try { // Устанавливаем соединение с сервером socket = new Socket(host, port); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream(), true); connected = true; // Логируем успешное подключение logger.log("Подключение к серверу " + host + ":" + port); // Получаем имя пользователя Scanner scanner = new Scanner(System.in); // Читаем приветственное сообщение от сервера System.out.println(reader.readLine()); // Запрашиваем имя у пользователя username = scanner.nextLine(); writer.println(username); // Отправляем имя на сервер logger.log("Пользователь " + username + " вошел в чат"); // Запускаем поток для чтения сообщений от сервера Thread messageReader = new Thread(() -> { try { String serverMessage; // Читаем сообщения пока подключение активно while (connected && (serverMessage = reader.readLine()) != null) { // Выводим сообщение в консоль System.out.println(serverMessage); // Логируем полученное сообщение logger.logMessage(username, serverMessage, "RECEIVED"); } } catch (IOException e) { if (connected) { System.out.println("Соединение с сервером разорвано"); logger.log("Соединение с сервером разорвано"); } } }); messageReader.start(); // Запускаем поток чтения // Главный цикл для отправки сообщений String userInput; while (connected && (userInput = scanner.nextLine()) != null) { // Проверяем команду выхода if (userInput.equalsIgnoreCase("/exit")) { writer.println("/exit"); // Уведомляем сервер о выходе break; } // Отправляем сообщение на сервер writer.println(userInput); // Логируем отправленное сообщение logger.logMessage(username, userInput, "SENT"); } } catch (IOException e) { System.err.println("Ошибка подключения: " + e.getMessage()); logger.log("Ошибка подключения: " + e.getMessage()); } finally { // Всегда выполняем отключение при выходе disconnect(); } } /** * Корректно отключается от сервера */ private void disconnect() { connected = false; // Сбрасываем флаг подключения try { if (socket != null) { socket.close(); // Закрываем сокет } } catch (IOException e) { System.err.println("Ошибка закрытия соединения: " + e.getMessage()); } logger.log("Клиент отключен"); System.out.println("До свидания!"); } /** * Точка входа для запуска клиента * * @param args аргументы командной строки (не используются) */ public static void main(String[] args) { // Загружаем настройки и подключаемся к серверу Settings settings = new Settings("settings.txt"); ChatClient client = new ChatClient(settings.getServerHost(), settings.getPort()); client.connect(); } }