Files
Maze/doc/multithread_maze_server.md
2025-05-05 15:31:08 +03:00

4.5 KiB
Raw Blame History

Реализация сетевого серверного приложения "Лабиринт" на основе многопоточности

При подключении клиента сервер порождает новый поток для работы с этим клиентом.

Протокол пользовательского уровня

UML-диаграмма протокола пользовательского уровня представлена на рисунке ниже.

UML-диаграмма протокола пользовательского уровня

Описание работы приложения

Сервер MazeServer ожидает подключения клиентов по протоколу TCP на заданный порт (по умолчанию 2000). После установления соединения сервер запрашивает имя игрока, а затем начинает игру в лабиринте. Лабиринт генерируется случайным образом при старте каждой новой игровой сессии. Гарантируется наличие хотя бы одного пути из начальной точки (0, 0) в конечную точку (2, 2). Добавление дополнительных стен происходит с соблюдением условия достижимости цели.

Cхема и нумерация клеток лабиринта представлена на рисунке ниже.

Схема лабиринта

Клиент отправляет команды движения ("вперёд", "направо", "налево", "назад") или команду "сдаюсь" для завершения игры. Сервер обрабатывает команды, проверяет возможность хода, обновляет состояние лабиринта и отправляет клиенту текстовый ответ с результатом хода, количеством оставшихся ходов и текущей позицией (в формате координат). Игра завершается, если игрок достигает конечной точки (позиция 8), исчерпывает ходы или сдаётся.

Запуск сервера

Приложение сервера при запуске принимает следующие необязательные ключи:

  • -h — задаёт имя хоста, к которому будет привязан сокет;
  • -p — задаёт номер порта для прослушивания;
  • -n — задаёт максимальное количество шагов, разрешённое для одного игрока;
  • -s — включает сервисный режим (без ограничений по количеству шагов).
./maze-server -h localhost -p 2000 -n 10 -s

По умолчанию сокет сервера связывается с адресом localhost:2000, игрокам разрешено 10 шагов, сервисный режим выключен.

Завершение работы сервера — Ctrl+C.

Клиент подключается к серверу, отправляет своё имя и получает интерактивную игру в лабиринт. Поддерживаемые команды:

  • вперёд — перемещение вверх;
  • направо — перемещение вправо;
  • налево — перемещение влево;
  • назад — перемещение вниз;
  • аюсь — завершение игры досрочно.

Если игрок исчерпал все ходы, но не дошёл до финиша, он считается проигравшим. Финиш находится в позиции (2, 2) (координаты x, y).

Запуск клиента

Приложение клиента при запуске принимает два необязательных ключа:

  • -h — задаёт имя хоста сервера для подключения;

  • -p — задаёт номер порта сервера.

./maze_client -h localhost -p 2000

По умолчанию клиент пытается подключиться к адресу localhost:2000.