|
|
|
|
# Задание
|
|
|
|
|
|
|
|
|
|
Написать систему мгновенного обмена сообщениями между несколькими пользователями. В проекте должна присутствовать
|
|
|
|
|
возможность сохранения состояния в формат, поддерживающий валидацию по схеме. Валидация должна производиться либо
|
|
|
|
|
в программе при импорте данных, либо в юнит-тестах, проверяющих корректность сохранения состояния.
|
|
|
|
|
|
|
|
|
|
# Описание реализации
|
|
|
|
|
|
|
|
|
|
Между клиентом и сервером происходит обмен 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"
|
|
|
|
|
```
|
|
|
|
|
|