/
alex_ep0411
/
java_lab7
Обзор
Документация
Войти
/
alex_ep0411
/
java_lab7
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/EchoServer.java
152 строки
7 KB
александр
лабораторная работа 7
08 июн 2026, 13:55
08 июн 2026, 13:55
2faa48e
Код
Авторство
О чём код?
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException; import java.nio.charset.StandardCharsets; /** * Эхо-сервер. Вариант 14: проверка строки на палиндром. * * Если строка является палиндромом, сервер добавляет "(palindrome)". * Примеры: * "radar" → "radar (palindrome)" * "java" → "java" * "A man a plan a canal panama" (без учета пробелов и регистра) → палиндром * * Учитывается регистр символов (по умолчанию — с учетом регистра, но можно * изменить метод isPalindrome, если требуется case-insensitive). */ public class EchoServer { private static final int DEFAULT_PORT = 12345; private static final int SOCKET_TIMEOUT_MS = 60000; // таймаут на чтение (1 минута) private static final boolean CASE_SENSITIVE = true; // false = регистронезависимая проверка public static void main(String[] args) { int port = DEFAULT_PORT; // Позволяем задать порт через аргумент командной строки if (args.length > 0) { try { port = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println("Неверный порт. Используется порт по умолчанию: " + DEFAULT_PORT); port = DEFAULT_PORT; } } System.out.println("=== Эхо-сервер (вариант 14: палиндром) ==="); System.out.println("Сервер запущен на порту " + port); System.out.println("Проверка палиндрома: " + (CASE_SENSITIVE ? "с учетом регистра" : "без учета регистра")); System.out.println("Ожидание подключений...\n"); // try-with-resources для автоматического закрытия ServerSocket try (ServerSocket serverSocket = new ServerSocket(port)) { // Бесконечный цикл приема клиентов while (true) { try { // accept() блокируется до подключения клиента Socket clientSocket = serverSocket.accept(); System.out.println("[+] Подключился клиент: " + clientSocket.getInetAddress().getHostAddress() + ":" + clientSocket.getPort()); // Устанавливаем таймаут на чтение данных от клиента clientSocket.setSoTimeout(SOCKET_TIMEOUT_MS); // Обрабатываем клиента (в текущем потоке — для простоты) handleClient(clientSocket); } catch (SocketTimeoutException e) { System.out.println("Таймаут ожидания данных от клиента"); } catch (IOException e) { System.err.println("Ошибка при подключении клиента: " + e.getMessage()); } } } catch (IOException e) { System.err.println("Критическая ошибка сервера: " + e.getMessage()); System.exit(1); } } /** * Обрабатывает одного подключенного клиента. * Читает строки до закрытия соединения или ошибки. */ private static void handleClient(Socket clientSocket) { // try-with-resources автоматически закроет socket и все потоки try (clientSocket; BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream(), StandardCharsets.UTF_8)); PrintWriter out = new PrintWriter( new OutputStreamWriter(clientSocket.getOutputStream(), StandardCharsets.UTF_8), true)) { String inputLine; int messageCount = 0; // Читаем все строки, отправленные клиентом while ((inputLine = in.readLine()) != null) { messageCount++; System.out.printf(" [%d] От клиента %s: \"%s\"%n", messageCount, clientSocket.getInetAddress().getHostAddress(), inputLine); // Формируем ответ согласно варианту 14 String response = processPalindromeEcho(inputLine); out.println(response); System.out.printf(" -> Ответ: \"%s\"%n", response); } System.out.println("[-] Клиент отключился: " + clientSocket.getInetAddress().getHostAddress() + " (обработано сообщений: " + messageCount + ")"); } catch (IOException e) { System.err.println("Ошибка при обмене данными с клиентом " + clientSocket.getInetAddress().getHostAddress() + ": " + e.getMessage()); } } /** * Реализация эхо-палиндрома (вариант 14). * Если строка является палиндромом, возвращает "строка (palindrome)". * Иначе — исходную строку без изменений. * * @param input входная строка от клиента * @return преобразованная строка */ private static String processPalindromeEcho(String input) { if (input == null || input.isEmpty()) { return input; // пустая строка возвращается как есть } // Проверка на палиндром if (isPalindrome(input, CASE_SENSITIVE)) { return input + " (palindrome)"; } else { return input; } } /** * Проверяет, является ли строка палиндромом. * * @param str строка для проверки * @param caseSensitive true = учитывать регистр, false = игнорировать регистр * @return true, если строка — палиндром */ private static boolean isPalindrome(String str, boolean caseSensitive) { if (str == null) return false; String workingStr = caseSensitive ? str : str.toLowerCase(); int left = 0; int right = workingStr.length() - 1; while (left < right) { if (workingStr.charAt(left) != workingStr.charAt(right)) { return false; } left++; right--; } return true; } }