Я изучаю структуру для взаимодействия с сервером и клиентом в своей многопользовательской игре.MulticastSocket для многопользовательской игры
Я пришел к выводу, что UDP - лучший выбор из-за способа «снимать и забывать», который не блокирует приложение, если пакет потерян. Я также буду использовать TCP для отправки надежных пакетов, например, во время процедур входа в систему и обмена информацией, например, смены сервера, изменения карты, обновлений и т. Д. Он также будет запускать чат на базе IRC. (все команды на самом деле являются пользовательскими сообщениями в стиле IRC).
Мне было интересно, как лучше всего отправлять сообщения взаимодействия (перемещения, заклинания, объекты, действия и т. Д.) Между сервером и клиентами.
Прочитав некоторую документацию, я пришел в MulticastSocket.
Мой вопрос:
Лучше отправить непрерывный поток информации для всех клиентов, начиная поток для каждого игрока (как и я в TCP связи), где каждый DatagramSockets будет слушать очереди отправки каждого нового сообщение клиенту. Это будет означать, что все карты и все движения (предположительно, могут быть 50 игроков по всем картам) будут отправлены всем игрокам, и каждый пакет должен быть больше, чтобы содержать всю эту информацию. Или лучше использовать поток для каждой карты, активный, только если какой-либо игрок находится внутри этой конкретной карты, используя многоадресную связь, отправив сообщение только игрокам, которые находятся внутри этой карты, и прослушивает MulticastSocket.
Я читал о проблемах с брандмауэром или маршрутизаторами с использованием многоадресной рассылки, но я не могу понять, каковы могут быть эти проблемы (отличные от обычных UDP).
Приложение должно использоваться любым человеком с небольшими проблемами конфигурации.
Некоторые маршрутизаторы настроены на блокирование многоадресных пакетов, поскольку они могут вызывать нежелательный трафик в сети. Представьте себе, что вредоносные пакеты многоадресной рассылки для злоумышленников распространяются по всей сети с помощью подстановочных адресов. Объем пакетов также имеет значение. Пакеты менее вероятны, если они находятся в большей сети (например, в Интернете) по сравнению с небольшими сетями, такими как частная локальная сеть. Что касается того, можно ли этого избежать (при использовании многоадресной рассылки), я не могу дать вам хороший ответ. – initramfs
Я не придерживаюсь многоадресной рассылки, на самом деле вопрос в том, что является лучшим способом создания коммуникационных серверов-клиентов с UDP, и я могу без проблем изменить. Может быть, я могу создать класс, который эмулирует многоадресный сокет, отправляя один и тот же пакет сразу нескольким клиентам? Но я не знаю, будет ли это достаточно быстро. Спасибо за ваш комментарий. – Gianmarco
. Меня больше беспокоит пропускная способность, чем скорость. Многоадресный пакет отправляется один раз по сравнению с традиционной сетевой структурой, для которой требуется пакет для каждого соединения.Если на сервере 50 игроков, вы должны учитывать пропускную способность 50x по сравнению с одним подключенным пользователем. Я только предлагал свои идеи по многолистовым пакетам. – initramfs