Vladimir Protsenko 2f87302b20 Corrections in README and build.sbt
..
project Added third example.
resources/schemas/v0.0.1 Added third example.
src Added third example.
.gitignore Added third example.
README.md Corrections in README and build.sbt
build.sbt Corrections in README and build.sbt

README.md

Задание

Написать систему мгновенного обмена сообщениями между несколькими пользователями. В проекте должна присутствовать возможность сохранения состояния в формат, поддерживающий валидацию по схеме. Валидация должна производиться либо в программе при импорте данных, либо в юнит-тестах, проверяющих корректность сохранения состояния.

Описание реализации

Между клиентом и сервером происходит обмен 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"