/
ProjectEroxa
/
NetworkChat
Обзор
Документация
Войти
/
ProjectEroxa
/
NetworkChat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/chat/server/ChatServer.java
118 строк
5 KB
Evgeniy Eroshkin
first_commit
07 окт 2025, 16:51
07 окт 2025, 16:51
57192a3
Код
Авторство
О чём код?
package chat.server; import chat.common.Logger; import chat.common.Settings; import java.io.*; import java.net.*; import java.util.concurrent.*; /** * Главный класс сервера чата * Управляет подключениями клиентов и рассылкой сообщений */ public class ChatServer { private int port; // Порт для подключения клиентов private ServerSocket serverSocket; // Сокет сервера // Множество подключенных клиентов (потокобезопасное) private ConcurrentHashMap.KeySetView<ClientHandler, Boolean> clients; private Logger logger; // Логгер для записи событий private boolean isRunning; // Флаг работы сервера /** * Конструктор сервера * * @param port порт для прослушивания */ public ChatServer(int port) { this.port = port; // Создаем потокобезопасное множество клиентов this.clients = ConcurrentHashMap.newKeySet(); this.logger = new Logger("server.log"); } /** * Запускает сервер и начинает принимать подключения */ public void start() { try { // Создаем серверный сокет на указанном порту serverSocket = new ServerSocket(port); isRunning = true; logger.log("Сервер запущен на порту " + port); System.out.println("Сервер чата запущен на порту " + port); // Бесконечный цикл принятия подключений while (isRunning) { // Ожидаем новое подключение (блокирующий вызов) Socket clientSocket = serverSocket.accept(); // Создаем обработчик для нового клиента ClientHandler clientHandler = new ClientHandler(clientSocket, this); clients.add(clientHandler); // Запускаем обработчик в отдельном потоке new Thread(clientHandler).start(); } } catch (IOException e) { if (isRunning) { System.err.println("Ошибка сервера: " + e.getMessage()); logger.log("Ошибка сервера: " + e.getMessage()); } } } /** * Рассылает сообщение всем подключенным клиентам, кроме отправителя * * @param message текст сообщения * @param sender отправитель сообщения */ public void broadcastMessage(String message, ClientHandler sender) { // Логируем отправленное сообщение logger.logMessage(sender.getUsername(), message, "SENT"); // Рассылаем сообщение всем клиентам кроме отправителя for (ClientHandler client : clients) { if (client != sender) { client.sendMessage(message); } } } /** * Удаляет клиента из списка подключенных * * @param client клиент для удаления */ public void removeClient(ClientHandler client) { clients.remove(client); String logMessage = "Клиент " + client.getUsername() + " отключен. Осталось: " + clients.size(); logger.log(logMessage); System.out.println(logMessage); } /** * Останавливает сервер */ public void stop() { isRunning = false; try { if (serverSocket != null) { serverSocket.close(); } } catch (IOException e) { System.err.println("Ошибка при остановке сервера: " + e.getMessage()); } } /** * Точка входа для запуска сервера * * @param args аргументы командной строки (не используются) */ public static void main(String[] args) { // Загружаем настройки и запускаем сервер Settings settings = new Settings("settings.txt"); ChatServer server = new ChatServer(settings.getPort()); server.start(); } }