Как правильно управлять сокетами для одновременных сражений в многопользовательской стратегии - PullRequest
0 голосов
/ 25 сентября 2018

Я строю стратегическую игру, в которой игроки могут сражаться друг с другом.На данный момент я сосредоточен на создании PvP-сражений 1 на 1, но я также хочу создать архитектуру, которая позволит дополнительно расширять сражения до 3 на 3.

Игра, которую я создаю, основана на сокет-клиенте.Архитектура сервера.Каждый игрок, который войдет в игру и нажмет кнопку «Найти матч», будет сражаться против одного из других игроков.

Однако у меня так много вопросов о том, как структурировать сокеты:

  1. Нужен ли отдельный сокет ("комнатный сокет") для каждой одновременной битвы?

  2. Кто должен создавать и привязывать комнатную розетку?Если это клиент, как сервер может подключиться к этому сокету, если порты клиента закрыты?Если это сервер, см. Стр.3

  3. Можно ли привязать все эти разъемы к одному порту?Как клиент может подключиться к «своему» сокету, если адреса и порты совпадают?

  4. Когда и как открыть «комнатные розетки», чтобы каждый клиент получил соответствующую конечную точку?Как записать это на стороне сервера?

  5. Сколько сокетов мне нужно для очереди для поиска совпадений («приветственные сокеты»)?

  6. Должен ли я использовать многопоточное программирование или можно обойтись без него?

Буду благодарен за любую помощь с этим

PS Поскольку язык, на котором я пишу свой сервер, не слишком распространен, я не могу использовать готовые решения

1 Ответ

0 голосов
/ 30 сентября 2018

От вашего вопроса я подозреваю, что вы могли бы извлечь пользу из просмотра Beej Guide to Network Programming .

  1. Нужен ли мне отдельный сокет ("комнатный сокет")для каждого одновременного сражения?

Я не уверен, что вы подразумеваете под "комнатным" сокетом.Если вы имеете в виду, что для каждой игры будет назначен другой сокет прослушивания, это будет нецелесообразно.

Обычный способ - это прослушивание сервером одного сокета (адрес / порт) икаждый клиент будет подключаться к сокету сервера.

Это означает, что сервер будет иметь сокет для каждого активного клиента + сокет прослушивания, а каждая реализация клиента будет иметь один сокет (сокет подключения).

Для игры 1: 1 сокеты могут быть «согласованы» с куплетом сервером, превращая этот «куплет» в комнату.

Для игры 1: много вы можете подумать об использовании паба/ sub шаблон путем реализации «каналов» и «подписок» ... Однако, поскольку (я предполагаю) игрок может одновременно входить только в одну игру, вы можете рассмотреть возможность создания массива или связанного списка игроков для каждой игры.

Можно ли привязать все эти сокеты к одному порту?Как клиент может подключиться к «своему» сокету, если адреса и порты совпадают?

Да, это возможно, и именно так на самом деле работают серверы.

Слушающий сокет ведет себя немного иначе, чем сокет подключения, в том смысле, что прослушивающий сокет может «принимать» соединения и создавать новый сокет для каждого соединения.

Когда и как открыть «комнатные розетки», чтобы каждый клиент получил соответствующую конечную точку?Как написать это на стороне сервера?

Это зависит от языка.Большинство языков имеют некоторые разновидности функций прослушивания в Руководстве по сетевому программированию Beej .

Обычно сервер вызывает listen, а затем создает новые клиентские сокеты, используя accept.Клиент будет звонить connect и иметь один сокет.

Сколько сокетов мне нужно для очереди на матч («приветственные сокеты»)?

Для игры 1: 1 вам понадобится один сокет «в очереди», поскольку он ожидаетследующее доступное соединение.

Конечно, это может быть более сложным.Если у клиента есть требование к игре (то есть, только игроки уровня 10 и выше), вам может потребоваться упорядоченный список или другое хранилище данных для управления очередью.

Должен ли я использовать многопоточное программирование, или можно обойтись без него?

Вероятно, вы можете запускать тысячи игр на одном компьютере с одним потоком, если вы используетеВыровненный (неблокирующий) дизайн.

Это действительно зависит от того, сколько работы выполняется на сервере и сколько работы выполняется на компьютере клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...