Задание: Создать два класса для клиента и сервера с многопоточным взаимодействием

Клиент

Класс "Client" имеет список данных в виде List от 1 до 100.

Методы

  • private Integer findDataByIndex(int index): метод для получения данных из списка по индексу и удаления этого значения из общего списка данных;
  • public void sendData(): метод для отправки запроса на сервер. Генерирует случайный индекс. Затем создает объект класса "Request" с этим значением и отправляет его на сервер в асинхронном режиме с задержкой в диапазоне от 100 до 500 мс. В методе выполняются проверки отправленных данных с логированием в файл resources/logs/application.log и консоль.
  • public void addResponseToCheck(Response response): метод для добавления значения Response в accumulator.

Сервер

Класс "Server" получает запросы от клиента и обрабатывает их. Метод обработки запроса имеет рандомную задержку в диапазоне от 100 до 1000 мс.

Методы

  • public Response processRequest(Request request): метод для обработки запросов от клиента. Возвращает общий размер принятых данных.
  • public boolean checkData(List<Integer> dataList): метод для проверки принятых данных с изначалиным листом перед отправкой.

Контроль правильности данных

  • После отправки всех запросов клиентом, размер списка данных в клиенте должен быть равен 0 (Итоговый результат записан в файл логов).
  • Список данных в сервере должен содержать значения от 1 до n без пробелов и повторений, и его размерность должна составлять n (Итоговый результат записан в файл логов).
  • Значение accumulator в клиенте должно быть равно (1+n) * (n/2) (Итоговый результат записан в файл логов).

Тестирование

Интеграционный тест клиента - сервера

Для проверки взаимодействия между клиентом и сервером, созданы объекты классов "Client" и "Server" и проверена их работа в многопоточности (Итоговый результат записан в файл логов).

Использование java.util.concurrent

В реализации использованы следующие классы из пакета java.util.concurrent:

  • Lock: для обеспечения синхронизации доступа к общему ресурсу "List" у клиента.
  • Callable: для выполнения запроса на сервер в отдельном потоке.
  • Executor: для управления потоками обработки запросов.
  • Future: для получения результата выполнения задачи обработки запроса.