Разделить программу из лабораторной работы №5 на клиентский и серверный модули. Серверный модуль должен осуществлять выполнение команд по управлению коллекцией. Клиентский модуль должен в интерактивном режиме считывать команды, передавать их для выполнения на сервер и выводить результаты выполнения.
- Операции обработки объектов коллекции должны быть реализованы с помощью
Stream API
с использованием лямбда-выражений. - Объекты между клиентом и сервером должны передаваться в
сериализованном
виде. - Объекты в коллекции, передаваемой клиенту, должны быть отсортированы по умолчанию
- Клиент должен корректно обрабатывать временную недоступность сервера.
- Обмен данными между клиентом и сервером должен осуществляться по протоколу
UDP
- Для обмена данными на сервере необходимо использовать
датаграммы
- Для обмена данными на клиенте необходимо использовать
сетевой канал
- Сетевые каналы должны использоваться в неблокирующем режиме.
- Работа с файлом, хранящим коллекцию.
- Управление коллекцией объектов.
- Назначение автоматически генерируемых полей объектов в коллекции.
- Ожидание подключений и запросов от клиента.
- Обработка полученных запросов (команд).
- Сохранение коллекции в файл при завершении работы приложения.
- Сохранение коллекции в файл при исполнении специальной команды, доступной только серверу (клиент такую команду отправить не может).
Серверное приложение должно состоять из следующих модулей (реализованных в виде одного или нескольких классов):
- Модуль приёма подключений.
- Модуль чтения запроса.
- Модуль обработки полученных команд.
- Модуль отправки ответов клиенту.
Сервер должен работать в
однопоточном
режиме.
- Чтение команд из консоли.
- Валидация вводимых данных.
- Сериализация введённой команды и её аргументов.
- Отправка полученной команды и её аргументов на сервер.
- Обработка ответа от сервера (вывод результата исполнения команды в консоль).
- Команду
save
из клиентского приложения необходимо убрать. - Команда
exit
завершает работу клиентского приложения.
Команды и их аргументы должны представлять из себя объекты классов. Недопустим обмен "простыми" строками. Так, для команды add или её аналога необходимо сформировать объект, содержащий тип команды и объект, который должен храниться в вашей коллекции.
Реализовать логирование различных этапов работы сервера (начало работы, получение нового подключения, получение нового запроса, отправка ответа и т.п.) с помощью
Log4J2
.
Описание хранимых в коллекции классов из 5 лабораторной:
public class City {
private long id; //Значение поля должно быть больше 0,
//Значение этого поля должно быть уникальным, Значение этого поля должно генерироваться автоматически
private String name; //Поле не может быть null, Строка не может быть пустой
private Coordinates coordinates; //Поле не может быть null
private java.util.Date creationDate; //Поле не может быть null,
//Значение этого поля должно генерироваться автоматически
private Integer area; //Значение поля должно быть больше 0
private int population; //Значение поля должно быть больше 0, Поле не может быть null
private Double metersAboveSeaLevel;
private Climate climate; //Поле может быть null
private Government government; //Поле не может быть null
private StandardOfLiving standardOfLiving; //Поле не может быть null
private Human governor; //Поле может быть null
}
public class Coordinates {
private Integer x; //Максимальное значение поля: 499
private double y; //Значение поля должно быть больше -274
}
public class Human {
private String name; //Поле не может быть null, Строка не может быть пустой
}
public enum Climate {
TROPICAL_SAVANNA,
OCEANIC,
STEPPE;
}
public enum Government {
ANARCHY,
GERONTOCRACY,
DEMARCHY,
COMMUNISM,
NOOCRACY;
}
public enum StandardOfLiving {
ULTRA_HIGH,
VERY_HIGH,
HIGH,
ULTRA_LOW,
NIGHTMARE;
}
Отчёт по работе должен содержать:
1) Текст задания.
2) Диаграмма классов разработанной программы (как клиентского, так и серверного приложения).
3) Исходный код программы.
4) Выводы по работе.
Вопросы к защите лабораторной работы:
1. Сетевое взаимодействие — клиент-серверная архитектура, основные протоколы, их сходства и отличия.
2. Протокол TCP. Классы `Socket` и `ServerSocket`.
3. Протокол UDP. Классы `DatagramSocket` и `DatagramPacket`.
4. Отличия блокирующего и неблокирующего ввода-вывода, их преимущества и недостатки. Работа с сетевыми каналами.
5. Классы `SocketChannel` и `DatagramChannel`.
6. Передача данных по сети. Сериализация объектов.
7. Интерфейс `Serializable`. Объектный граф, сериализация и десериализация полей и методов.
8. Java Stream API. Создание конвейеров. Промежуточные и терминальные операции.
9. Шаблоны проектирования: Decorator, Iterator, Factory method, Command, Flyweight, Interpreter, Singleton, Strategy, Adapter, Facade, Proxy.