Cервер отвечает за менеджмент списка дел.
Центральным для логики программы компонентом будет класс Todos. Объект этого класса должен содержать в себе набор задач, добавленных в систему.
Каждая задача представляет собой обычное значение типа String
. Например: "Сходить в магазин"
, "Пойти на пробежку"
. Все задачи добавленные в менеджер можно считать уникальными, т.е. без повторов.
Изначально объект этого класса не должен содержать никаких задач, но должна быть возможность:
- добавить их через метод
add
; - удалить через метод
remove
.
У этого объекта есть возможность получить все актуальные задачи разом через метод getAllTasks
- метод возвращает все задачи через пробел в отсортированном лексикографическом (словарном) порядке. Например, если мы добавили задачу "Пробежка", "Акробатика" и "Учёба", то этот метод должен вернуть строку вида Акробатика Пробежка Учёба
.
В списке задач не должно быть больше чем 7 задач. Поэтому, при попытке добавления 8й задачи она добавляться не должна.
Сервер создаётя и запускается в классе Main. После старта, он в бесконечном цикле принимает подключения и считывает с них одну строку, в которой будет располагаться json вида:
{ "type": "ADD", "task": "Название задачи" }
где type
- тип операции (ADD
или REMOVE
), а task
- сама задача.
Таким образом, одна операция соответствует одному запросу (а не один запрос с кучей строк-операций).
Для парсинга входных данных подключения используется библиотека GSon (com.google.code.gson:gson:2.8.9
). Предполагается, что на сервер всегда приходят корректные данные.
В ответ на запрос сервер присылает текущее состояние списка задач после совершения операции и в том виде, в котором его возвращает операция getAllTasks
(т.е. без всяких json и тп).
Простой сервер
try (ServerSocket serverSocket = new ServerSocket(8989);) { // стартуем сервер один(!) раз
while (true) { // в цикле(!) принимаем подключения
try (
Socket socket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
) {
// обработка одного подключения
}
}
} catch (IOException e) {
System.out.println("Не могу стартовать сервер");
e.printStackTrace();
}
Для демонстрационных целей написан класс клиента.
Добавлена поддержка третьей операции. Она задается json-ом вида { "type": "RESTORE" }
.
В случае получения такой операции, сервер должен отменить действие последней не-RESTORE-операции.
Т.е. после операций
{ "type": "ADD", "task": "Первая" }
{ "type": "ADD", "task": "Вторая" }
{ "type": "REMOVE", "task": "Первая" }
{ "type": "ADD", "task": "Третья" }
{ "type": "RESTORE" }
{ "type": "RESTORE" }
В списке задач в ответ на последнюю операцию должно быть прислано: "Вторая Первая".