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.

44 lines
2.7 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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