Как создать простую игру для 2 игроков, общаясь через Интернет, без какого-либо специального кода на каком-либо сервере? - PullRequest
4 голосов
/ 27 января 2010

Как мне создать простую игру для 2 игроков, которая общается через Интернет?

Мне нужно решить следующие проблемы:

  • поиск или встреча - два игрока хотят найти друг друга.

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

В этом отношении, я полагаю, это эквивалентно двустороннему чату, в котором люди хотят иметь возможность находить друг друга, а также, когда они в паре, общаться друг с другом.

Дополнительные требования:

  1. на данный момент предположим, что конечными точками являются ОС Windows, относительно недавние.

  2. предполагается, что ни один конечный компьютер не доступен напрямую из Интернета.Предположим, что они являются клиентскими компьютерами, скрытыми за брандмауэрами, которые блокируют входящие запросы.Машины могут делать исходящие запросы.(скажем, через HTTP, но с TCP тоже все в порядке)

  3. связь должна быть конфиденциальной.Для простоты предположим, что общий секрет уже существует, и конечные точки могут выполнять AES.Я предполагаю, что я имею в виду, что любой посредник не должен расшифровывать пакеты сообщений.Расшифровка произойдет только в конечных точках.

  4. весь пользовательский код должен выполняться только на клиентских ПК.

  5. Предположим, что в Интернете нет сервера, который находится под моим контролем.

  6. Я рад использовать сторонние серверы для облегчения взаимодействия, такие как IM-сервер или что-то еще, если он бесплатный, и мне не требуется устанавливать на него собственный код,


Какие API доступны для облегчения этой конструкции?

Могу ли я сделать это с помощью API IM?WCF?Есть ли каналы WCF для Windows Messenger?

Какие протоколы?HTTP?Я пометил это как «одноранговый», но я имею в виду, что фактически ;нет строгих требований к формальному протоколу p2p.

Какие форматы сообщений вы бы использовали?


РЕДАКТИРОВАТЬ

Чтобы прояснить требования к серверам, я хочу НЕ СЕРВЕР ПОД МОЕМ УПРАВЛЕНИЕМ.И НИКАКОГО МОЕГО ТАМОЖЕННОГО КОДА НА ЛЮБОМ СЕРВЕРЕ.Это не то же самое, что «Нет сервера».

Подумайте об этом так: я могу отправить электронное письмо по SMTP, используя собственный код, который я пишу на стороне отправителя и получателя.Мой пользовательский код можно подключить через бесплатный SMTP-сервер-посредник.Это не требует установки кода на SMTP-сервере.Это что-то вроде того, что я хочу, но SMTP не является приемлемым из-за задержки.

EDIT2
Я также нашел это: библиотека для обмена мгновенными сообщениями, как libpurple, но написанная на C #


ОТВЕТ

Я могу делать то, что хочу, используя библиотеки для фреймворков IM.Одним из простых способов сделать это с помощью Windows Live Messenger является использование Messenger Activity SDK .Это подтверждает концепцию, но не является общим решением.Но аналогичные вещи могут быть выполнены с помощью библиотек IM для различных систем обмена сообщениями, таких как libpurple, или с помощью библиотек libs для каналов IRC.Во всех этих случаях IM-серверы действуют как коммуникационная инфраструктура, проникающая через брандмауэр.

Ответы [ 7 ]

3 голосов
/ 27 января 2010

В каждой игре для двух игроков должна быть серверная среда определенного типа, так как для этого необходимо как минимум установить связь между двумя клиентами / игроками. Имейте в виду, что каждый из клиентов / игроков также может выступать в качестве своего собственного сервера для связи с другими связанными клиентами. Но необходимость следить за всеми клиентами / игроками в любой момент времени и необходимость облегчать поиск других клиентов / игроков изначально требует определенного типа серверной среды.

3 голосов
/ 27 января 2010

IM - неправильный инструмент. Вместо этого используйте IRC-чат.

В IRC-чате ваши клиенты «входят» в чат-комнату, и это используется для вашего «присутствия». Любой, кто находится в чате, «доступен» для игры.

Как только это будет сделано, игровой экземпляр будет общаться друг с другом через чат. Они могут использовать глобальный канал или просто частные IRC-каналы для игрового трафика.

Вопросы для решения:

  • Во-первых, все игровые состояния делятся на клиентов. Многие игры сделали это (RTS, как Age of Empires, RPG, как Diablo). Но состояния клиентов подвержены взлому и мошенничеству. Это простая истина. Если игра популярна, она будет взломана.

  • Пинг трафик. По сути, вы входите в комнату, ваш клиент находится в режиме «доступно для игры». Затем он пингует всех остальных, чтобы увидеть, доступны ли они для игры. Это будет происходить с каждым клиентом, "входящим" в чат-комнату. Затем вы можете использовать общедоступную комнату для трансляции событий «Фрэнк готов к новой игре», «Фрэнк начал игру с Джо» и т. Д. Это может помочь синхронизировать игры, а не общаться, но когда клиент подключается к чату комната, это будет идти "Привет всем, это Боб, что вы все делаете". Так что вам нужно справиться с этим.

  • Объем трафика. IRC комнаты могут обрабатывать много трафика, но не много трафика. Большинство из них предназначены для предотвращения «спама», «затопления» и т. Д. Таким образом, вы вполне можете ограничить скорость игры. Не проблема для «Шашек», тем более для «World of Warcraft» во время рейда на 40 человек. Это проблема игрового дизайна.

  • Условия обслуживания. Поставщик IRC вполне может сказать: «Нет, вы не можете сделать это с помощью нашего сервиса». Я не смотрел на это, поэтому я не знаю, но это может быть проблемой.

Кроме того, IRC довольно хорошо подходит. Множество IRC-кода бота, плавающего в сети, я никогда не использовал его.

1 голос
/ 27 января 2010

libpurple вместе с otr может предоставить вам конфиденциальность по сравнению с IM, которая понадобится приложению.

0 голосов
/ 27 января 2010

Одноранговая связь отсутствует из-за ограничений брандмауэра. В любом случае, для служб каталогов это не так-то просто.

Следующий простой способ, который я бы использовал, - это запустить очень простой скрипт CGI-сервера на одном из многочисленных супердешевых сайтов. Кажется, вы не хотите идти по этому пути. Есть ли какая-то конкретная причина? 100 строк кода и супер дешевый сервер должны дать вам все, что вы просите, и даже больше.

Полагаю, вы могли бы подключиться к какой-нибудь сторонней библиотеке чата. Я не знаю о текущих протоколах IM, но старый добрый IRC и отдельный канал для вашей игры будут работать. Вы даже можете сделать что-то вместе, используя FTP. Блоги комментарии на бесплатном сайте блога будет работать тоже. Вопрос почему?

Это все кладжи. Они выполняют свою работу тупыми, не элегантными и плохо масштабируемыми способами.

Я призываю вас пересмотреть решение для веб-сервера.

0 голосов
/ 27 января 2010

Как кто-то сказал, это может быть еще невозможно, если у вас нет посреднического сервера между двумя игроками. Поскольку вы счастливы использовать сторонний сервер, я предлагаю вам собрать систему, используя Google App Engine + XMPP по HTTP. Он хорошо работает через интернет и за брандмауэром. И все же это бесплатно (до тех пор, пока ваша система не вырастет из квоты GAE).

0 голосов
/ 27 января 2010

Вы можете настроить доску объявлений на одном из бесплатных серверов доски объявлений, чтобы игроки могли находить друг друга. Возможно, вы захотите поощрять их использовать личные сообщения для обмена IP-адресами. Затем используйте протокол, который подключается с использованием IP-адресов. Удачи с этим. Брандмауэры причиняют боль.

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

Я могу вам сказать прямо сейчас, что вы были бы намного счастливее в жизни, если бы написали веб-сервис для облегчения общения. Но для этого вам понадобится сервер.

Удачи. Тебе это понадобится.

ИЛИ, вы могли бы просто написать игру для IM-клиента, такого как Microsoft Messenger. Я видел игры для этого, поэтому я знаю, что это можно сделать.

0 голосов
/ 27 января 2010

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

...