You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

42 lines
2.7 KiB
Markdown

# Задание
Написать систему мгновенного обмена сообщениями между несколькими пользователями. В проекте должна присутствовать
возможность сохранения состояния в формат, поддерживающий валидацию по схеме. Валидация должна производиться либо
в программе при импорте данных, либо в юнит-тестах, проверяющих корректность сохранения состояния.
# Описание реализации
Между клиентом и сервером происходит обмен JSON сообщениями вида (класс `datatypes.Message`):
```
{"senderId":"AD60","receiverId":"C399","body":"hello", timestamp:"2020-09-11T08:54:45.528807100Z"}
```
- `senderId` - идентификатор отправителя,
- `receiverId` - идентификатор получателя,
- `body` - текстовое сообщение,
- `timestamp` - время создания сообщения.
При подключении клиент должен отправить JSON сообщение со своим именем (класс `datatypes.ClientInfo`):
```
{"timestamp":"2020-09-11T08:49:44.644320700Z", "login":"0FB9"}
```
При получении и отправлении сообщения на сервере производится сохранение поля `timestamp` в JSON файл (класс `datatypes.ClientState`)
в заранее созданную папку `states_path`, указанную при старте сервера в качестве аргумента. Пример сохранённого состояния пользователя
0FB9 в файле 0FB9.json:
```
{"lastMessageTimestamp":"2020-09-11T08:49:44.644320700Z"}
```
Для данной структуры разработана JSON схема `resources/schemas/v0.0.1/ClientStateSchema.json`. Проверка соответствия
сохраняемого состояния схеме производится юнит тестом `SchemaCompliance.checkClientStateSchemeCompliance`.
# Инструкция запуска
Тестовый запуск можно произвести из среды разработки или из консоли при наличии в системе утилиты sbt https://www.scala-sbt.org/.
```
sbt "runMain client.Server --host 192.168.0.2 --port 10000 --states_path ./client_states"
sbt "runMain client.Client --host 192.168.0.2 --port 10000"
```