Я начинаю небольшой проект, в основном, многопользовательский (как у более чем двух игроков) вариант классической игры Battleship.
Одна из проблем, которую я пытаюсь решить, прежде чем погрузиться в кодирование, - проблема связи между несколькими игроками. В настоящее время существует возможность использования центрального HTTP-сервера в качестве центрального концентратора для связи (в сочетании с Android C2DM API, позволяющим осуществлять push-связь с HTTP-сервера на устройства). Это кажется хорошим решением, потому что теоретически, если у вас есть доступ к Интернету, он должен работать отлично, независимо от того, находитесь вы за NAT или нет.
Однако предлагаемое решение имеет недостаток существующей единой точки отказа/дополнительной нагрузки (веб-сервера). Поэтому я хотел бы попробовать другие варианты. Я думал о том, чтобы делать прямые подключения с помощью Sockets между клиентами (с использованием только того, что веб-сервер используется в качестве начальной точки встречи), однако это будет работать только в том случае, если все устройства находятся в одной сети. Учитывая, что сегодня мы почти всегда находимся за NAT маршрутизатора, как я могу достичь прямой связи? Я читал о перфорации отверстий, но я не могу найти хорошую библиотеку, которая хорошо документирована (содержит хорошие примеры использования) и работает на Android точно. Кроме того, большинство (если не все) методов перфорации отверстий (STUN, ICE и т.д.) Широко доступны только для работы с UDP, что отлично подходит для аудио/видео и многопользовательских игр в режиме реального времени, которые могут потерять некоторые сообщения, но для многопользовательского режима на основе игры важно гарантировать доставку данных каждого хода (что-то, что невозможно непосредственно с UDP).
Итак, какие-либо идеи о том, как добиться надежной перфорации отверстий (желательно через TCP) между Android устройствами за NAT? Он не должен работать в 100% случаев (некоторые незнакомые NAT могут не поддерживаться), но было бы неплохо, если бы он работал в большинстве случаев.