# Техническое задание к программе **Необходимо выполнить следующие требования:** - Операции обработки объектов коллекции должны быть реализованы с помощью Stream API с использованием лямбда-выражений. - Объекты между клиентом и сервером должны передаваться в сериализованном виде. - Объекты в коллекции, передаваемой клиенту, должны быть отсортированы по названию - Клиент должен корректно обрабатывать временную недоступность сервера. - Обмен данными между клиентом и сервером должен осуществляться по протоколу UDP - Для обмена данными на сервере необходимо использовать **датаграммы** - Для обмена данными на клиенте необходимо использовать **сетевой канал** - Сетевые каналы должны использоваться в неблокирующем режиме. **Обязанности серверного приложения:** - Работа с файлом, хранящим коллекцию. - Управление коллекцией объектов. - Назначение автоматически генерируемых полей объектов в коллекции. - Ожидание подключений и запросов от клиента. - Обработка полученных запросов (команд). - Сохранение коллекции в файл при завершении работы приложения. - Сохранение коллекции в файл при исполнении специальной команды, доступной только серверу (клиент такую команду отправить не может). **Серверное приложение должно состоять из следующих модулей (реализованных в виде одного или нескольких классов):** - Модуль приёма подключений. - Модуль чтения запроса. - Модуль обработки полученных команд. - Модуль отправки ответов клиенту. Сервер должен работать в **однопоточном** режиме. **Обязанности клиентского приложения:** - Чтение команд из консоли. - Валидация вводимых данных. - Сериализация введённой команды и её аргументов. - Отправка полученной команды и её аргументов на сервер. - Обработка ответа от сервера (вывод результата исполнения команды в консоль). - Команду `save` из клиентского приложения необходимо убрать. - Команда `exit` завершает работу клиентского приложения. **Важно!** Команды и их аргументы должны представлять из себя объекты классов. Недопустим обмен "простыми" строками. Так, для команды add или её аналога необходимо сформировать объект, содержащий тип команды и объект, который должен храниться в вашей коллекции. **Принцип работы клиентской части** 1. ввод команды 2. валидация команды (без запроса на сервер, у клиента должна быть информация о доступных командах) 3. ввод аргументов 4. запрос на сервер 5. обработка ответа от сервера 6. вывод информации **Принцип работы серверного приложения** 1. подключение 3. получение запроса 4. выполнение команды 5. отправка ответа **Примечания** 1. сервер может работать сразу с несколькими клиентами, но не параллельно 2. клиент продолжает работать даже если сервер -- нет (должно быть информирование пользователя о том, что сервер умер + попытки подключения раз в N секунд) 3. Общение между клиентом и сервером должно быть в виде json строк