Клиент для экспериментального игрового сервера
Далее будет приведно описание структур и типов даынных. Несмотря на отличие применяемого языка программирования, описания и примеры структур и типов будут приведены на С++.
Так же все структуры должны быть упакованы. В примерах на C++ соответсвующие директивы опущены.
Все структуры начинаются с поля type, которое определяет тип структуры при обмене между клиентом и сервером.
/// Тип передаваемой структуры
enum class Type : uint8_t
{
COMMAND = 0, ///< Команда
PLACEMENT = 1 ///< Положение
};Структура Command описывает команды, поступающие от клиентов.
/// Идентифкаторы команд
enum class CommandID : uint8_t
{
CONNECT = 0, ///< Отправляется при подключении клиента
DISCONNECT = 1, ///< Отправляется при отключение клиента
PING = 2, ///< Отправляется для поддержания присутсвия
ERROR = 0xFF ///< Отправляется сервером при ошибке
}
/// Команда от клиента
class Command
{
Type type = Type::COMMAND; ///< Тип команды
uint32_t id; ///< Идентификатор клиента
CommandID cmd; ///< Идентифкатор команды
};Структура Placement описывает положение и ориентацию в пространстве клиента.
/// Положение и ориентацию в пространстве клиента
class Placement
{
Type type = Type::PLACEMENT; ///< Тип команды
uint32_t id; ///< Идентификатор клиента
float x; ///< Координата по оси X
float y; ///< Координата по оси Y
float z; ///< Координата по оси Z
float rotX; ///< Поворот вокруг оси X
float rotY; ///< Поворот вокруг оси Y
float rotZ; ///< Поворот вокруг оси Z
};Взаимодействие между клиентом и сервером происходит с использованием WebSocket.
При подключенни клиент отправляет структуру Command со своим ID и cmd == CommandID::CONNECT. В ответ сервер присылает массив структур Placement всех подключенных клиентов.
Далее клиент периодически отправляет структуру Placement со своим ID, положением и ориентацией в пространстве.
Если изменений нет, то, не реже чем раз в 5 секунд, необходимо отправлять структуру Command со своим ID и cmd == CommandID::PING.
Отсутствие обновлений структуры Placement или команды Ping будет воспринято сервером как потеря соединения.
Серврер, накапливая обновления от клиентов, периодически отправляет массив структур Placement тех клиентов, положение или ориентацией в пространстве которых, изменились.
При отключении клиента (по команде или отсутсвию пингов), сервер рассылает оставшимся клиентам структуру Command с ID отключенного клиента и cmd == CommandID::DISCONNECT.
Если клиентом направлена структура с ошибкой, то сервер должен ответить структурой Command с ID == 0xFFFFFFFF и cmd == CommandID::ERROR.
Возможные варианты ошибок:
- не поддерживаемое значение поля
type; - не поддерживаемое значение поля
cmdструктурыCommand; - нарушение flow (подключение ->
Command{Connect}->PlacementилиCommand{Ping}->Command{Disconnect}-> отключение)