Android P2P (прямое подключение) через интернет (за NAT)

Я начинаю небольшой проект, в основном многопользовательскую (то есть более двух игроков) вариацию классической игры Морской бой.

Одна проблема, которую я пытаюсь решить, прежде чем погрузиться в программирование, — это проблема коммуникации между несколькими игроками. Текущая возможность заключается в использовании центрального HTTP-сервера в качестве центрального узла для связи (в сочетании с Android C2DM API для обеспечения принудительной связи с HTTP-сервера на устройства). Это кажется хорошим решением, потому что теоретически, пока у вас есть доступ к Интернету, он должен работать отлично, независимо от того, находитесь ли вы за NAT или нет.

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

Итак, есть идеи, как добиться надежного пробивки отверстий (желательно по протоколу TCP) между устройствами Androidза NAT? Он не должен работать в 100% случаев (некоторые странные NAT могут не поддерживаться), но было бы неплохо, если бы он работал в большинстве случаев.

19
задан petersaints 4 April 2012 в 15:39
поделиться