TCP/IP-интерфейс для хранилища. Добавляется возможность работы с хранилищем удаленно с использованием текстового протокола. Консольное приложение должно реализовывать режимы работы "сервер" и "клиент".
Каждое принятое подключение нужно обрабатывать в отдельном треде. Для подключения нужно создать шелл с командами, аналогичными командам из предыдущих работ, и рассматривать incoming и outgoing потоки подключения как входящий и исходящий потоки для шелла. Уточним, что по команде exit нужно лишь закрыть подключение, но не останавливать весь сервер. Поскольку каждое подключение будет обрабатываться в отдельном треде, для подключений будет имитироваться транзакционная модель (см. 7ое задание).
Выполняет запуск сервера, выполняя прослушивание указанного порта. Если порт не указан, прослушивается порт 10001
:
start port
В случае успеха печатается:
started at port
В случае ошибки:
not started: текст ошибки
Например:
not started: wrong port number
not started: already started
Останавливает работу сервера:
stop
В случае успеха печатается:
stopped at port
Если сервер не стартован, выводит:
not started
Выводит список все присоединённых пользователей:
listusers
Если сервер не стартован, выводит:
not started
Список пользователей выглядит следующим образом:
192.168.1.2:8080
192.168.1.3:37012
Для работы с сервером хранилища можно будет использовать Telnet-клиент. Однако, будет полезным написать Remote-клиент для сервера. Нужно написать реализацию RemoteTableProviderFactory.
Клиент должен открывать подключение к серверу по указанному порту и имени узла, после чего предоставлять API для работы с хранилищем, по функциональности аналогичное обычному API для работы с локальным хранилищем.
Приложение в режиме клиента отправляет команды через RemoteTableProvider удалённому серверу.
Выполняет соединение с сервером. Если соединение с сервером (этим или другим) уже установлено, необходимо выводить сообщение об ошибке.
connect host port
В случае успеха:
connected
В случае ошибки:
not connected: текст ошибки
Команда должна корректно закрывать удалённое соединение:
disconnect
Если соединение закрыто:
disconnected
Если соединения не было:
not connected
Команда выводит текущее состояние, либо local
, либо remote host port
.
Приложение должно уметь прерывать работы при нажатии в консоли Ctrl+C (что эквивалентно сигналу SIGINT). При этом нужно закрыть все подключения, в т.ч. выполнив для них rollback.
- Нажатие Ctrl+C на клавиатуре вызывает сигнал SIGINT. Этот сигнал, по умолчанию, производит "вежливую" остановку JVM. Вы можете использовать Runtime.addShutdownHook() для корректного завершения работы.
- Фактически, можно стартовать сервер в приложении и к нему же подсоединиться. Таким образом можно проверять работоспособность приложения.
- Вам может потребоваться знать схему удаленной таблицы. Для этого можете добавить в шелл отдельную команду
describe tablename
, которая будет выводить схему. Другой выход - полностью перенести валидацию данных на сервер. - Для одновременной работы с несколькими удаленными таблицами можно создавать несколько TCP-сессий.