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