Android P2P (прямое соединение) через Интернет (за NAT)
Я начинаю небольшой проект, в основном, многопользовательский (как у более чем двух игроков) вариант классической игры Battleship.
Одна из проблем, которую я пытаюсь решить, прежде чем погрузиться в кодирование, - проблема связи между несколькими игроками. В настоящее время существует возможность использования центрального HTTP-сервера в качестве центрального концентратора для связи (в сочетании с Android C2DM API, позволяющим осуществлять push-связь с HTTP-сервера на устройства). Это кажется хорошим решением, потому что теоретически, если у вас есть доступ к Интернету, он должен работать отлично, независимо от того, находитесь вы за NAT или нет.
Однако предлагаемое решение имеет недостаток существующей единой точки отказа/дополнительной нагрузки (веб-сервера). Поэтому я хотел бы попробовать другие варианты. Я думал о том, чтобы делать прямые подключения с помощью Sockets между клиентами (с использованием только того, что веб-сервер используется в качестве начальной точки встречи), однако это будет работать только в том случае, если все устройства находятся в одной сети. Учитывая, что сегодня мы почти всегда находимся за NAT маршрутизатора, как я могу достичь прямой связи? Я читал о перфорации отверстий, но я не могу найти хорошую библиотеку, которая хорошо документирована (содержит хорошие примеры использования) и работает на Android точно. Кроме того, большинство (если не все) методов перфорации отверстий (STUN, ICE и т.д.) Широко доступны только для работы с UDP, что отлично подходит для аудио/видео и многопользовательских игр в режиме реального времени, которые могут потерять некоторые сообщения, но для многопользовательского режима на основе игры важно гарантировать доставку данных каждого хода (что-то, что невозможно непосредственно с UDP).
Итак, какие-либо идеи о том, как добиться надежной перфорации отверстий (желательно через TCP) между Android устройствами за NAT? Он не должен работать в 100% случаев (некоторые незнакомые NAT могут не поддерживаться), но было бы неплохо, если бы он работал в большинстве случаев.
Ответы
Ответ 1
используйте xmpp через smack over gtalk. Вам не нужно беспокоиться о сервере и о единственной точке отказа. позвольте google беспокоиться об этом! Я написал Тетрис, чтобы он играл против двух игроков, использующих gtalk в качестве уровня общения. http://code.google.com/p/tetrads-drop-lite/ Вы можете попробовать MUC, если хотите больше игроков.
Ответ 2
Вы в значительной степени вынуждены использовать посредника. Вы можете найти Natblaster для механизма, который будет работать для установления TCP-соединений между некоторыми NAT-устройствами, но это не то, что вы можете использовать в Android, не укореняя оба устройства. И даже тогда, это экспериментальный.
Лучше всего, вероятно, использовать существующую федеративную систему обмена сообщениями, такую как jabber.
Ответ 3
UDP не является надежной доставкой, но вы можете сделать его надежным, требуя, чтобы отправить пакеты UDP, чтобы подтверждения были возвращены. Это, наряду с несколькими другими требованиями, является тем, что делает TCP надежным по IP (что не так уж и сложно).
В качестве примечания, это можно реализовать, но, вероятно, потребуется много времени, и затраты/выгоды могут не сработать в вашей ситуации.