forked from dkomanov/fizteh-java-2014
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request dkomanov#348 from dkomanov/add-task-08
Added task 08 - Telnet
- Loading branch information
Showing
1 changed file
with
141 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
## Telnet | ||
|
||
TCP/IP-интерфейс для хранилища. Добавляется возможность работы с хранилищем удаленно с использованием текстового | ||
протокола. Консольное приложение должно реализовывать режимы работы "сервер" и "клиент". | ||
|
||
### Режим сервера | ||
|
||
Каждое принятое подключение нужно обрабатывать в отдельном треде. Для подключения нужно создать шелл с командами, | ||
аналогичными командам из предыдущих работ, и рассматривать incoming и outgoing потоки подключения как | ||
входящий и исходящий потоки для шелла. Уточним, что по команде exit нужно лишь закрыть подключение, но не | ||
останавливать весь сервер. Поскольку каждое подключение будет обрабатываться в отдельном треде, для подключений | ||
будет имитироваться транзакционная модель (см. 7ое задание). | ||
|
||
#### Команды | ||
|
||
##### start | ||
|
||
Выполняет запуск сервера, выполняя прослушивание указанного порта. Если порт не указан, прослушивается порт ```10001```: | ||
``` | ||
start port | ||
``` | ||
|
||
В случае успеха печатается: | ||
``` | ||
started at port | ||
``` | ||
|
||
В случае ошибки: | ||
``` | ||
not started: текст ошибки | ||
Например: | ||
not started: wrong port number | ||
not started: already started | ||
``` | ||
|
||
##### stop | ||
|
||
Останавливает работу сервера: | ||
``` | ||
stop | ||
``` | ||
|
||
В случае успеха печатается: | ||
``` | ||
stopped at port | ||
``` | ||
|
||
Если сервер не стартован, выводит: | ||
``` | ||
not started | ||
``` | ||
|
||
##### listusers | ||
|
||
Выводит список все присоединённых пользователей: | ||
``` | ||
listusers | ||
``` | ||
|
||
Если сервер не стартован, выводит: | ||
``` | ||
not started | ||
``` | ||
|
||
Список пользователей выглядит следующим образом: | ||
``` | ||
192.168.1.2:8080 | ||
192.168.1.3:37012 | ||
``` | ||
|
||
### Remote-клиент | ||
|
||
Для работы с сервером хранилища можно будет использовать Telnet-клиент. Однако, будет полезным написать | ||
Remote-клиент для сервера. Нужно написать реализацию | ||
[RemoteTableProviderFactory](../src/ru/fizteh/fivt/storage/structured/RemoteTableProviderFactory.java). | ||
|
||
Клиент должен открывать подключение к серверу по указанному порту и имени узла, после чего предоставлять API для | ||
работы с хранилищем, по функциональности аналогичное обычному API для работы с локальным хранилищем. | ||
|
||
### Режим клиента | ||
|
||
Приложение в режиме клиента отправляет команды через RemoteTableProvider удалённому серверу. | ||
|
||
#### Команды | ||
|
||
##### connect | ||
|
||
Выполняет соединение с сервером. Если соединение с сервером (этим или другим) уже установлено, необходимо выводить | ||
сообщение об ошибке. | ||
``` | ||
connect host port | ||
``` | ||
|
||
В случае успеха: | ||
``` | ||
connected | ||
``` | ||
|
||
В случае ошибки: | ||
``` | ||
not connected: текст ошибки | ||
``` | ||
|
||
##### disconnect | ||
|
||
Команда должна корректно закрывать удалённое соединение: | ||
``` | ||
disconnect | ||
``` | ||
|
||
Если соединение закрыто: | ||
``` | ||
disconnected | ||
``` | ||
|
||
Если соединения не было: | ||
``` | ||
not connected | ||
``` | ||
|
||
##### whereami | ||
|
||
Команда выводит текущее состояние, либо ```local```, либо ```remote host port```. | ||
|
||
### Реагирование на Ctrl+C | ||
|
||
Приложение должно уметь прерывать работы при нажатии в консоли Ctrl+C (что эквивалентно сигналу SIGINT). При этом | ||
нужно закрыть все подключения, в т.ч. выполнив для них rollback. | ||
|
||
### Комментарии | ||
|
||
* Нажатие Ctrl+C на клавиатуре вызывает сигнал [SIGINT](http://ru.wikipedia.org/wiki/SIGINT). Этот сигнал, по умолчанию, | ||
производит "вежливую" остановку JVM. Вы можете использовать | ||
[Runtime.addShutdownHook()](http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html) для корректного завершения | ||
работы. | ||
* Фактически, можно стартовать сервер в приложении и к нему же подсоединиться. Таким образом можно проверять | ||
работоспособность приложения. | ||
* Вам может потребоваться знать схему удаленной таблицы. Для этого можете добавить в шелл отдельную команду | ||
```describe tablename```, которая будет выводить схему. Другой выход - полностью перенести валидацию данных на сервер. | ||
* Для одновременной работы с несколькими удаленными таблицами можно создавать несколько TCP-сессий. |