Расширение ответа Гала, который также будет включать причины для исключения:
private String extrapolateStackTrace(Exception ex) {
Throwable e = ex;
String trace = e.toString() + "\n";
for (StackTraceElement e1 : e.getStackTrace()) {
trace += "\t at " + e1.toString() + "\n";
}
while (e.getCause() != null) {
e = e.getCause();
trace += "Cause by: " + e.toString() + "\n";
for (StackTraceElement e1 : e.getStackTrace()) {
trace += "\t at " + e1.toString() + "\n";
}
}
return trace;
}
Во-первых, позвольте мне сказать, что это выходит за рамки моей компетенции, но я обнаружил, что мне это очень интересно, поэтому я ' я занимался поиском и чтением.
Похоже, что наиболее часто назначаемым решением для обхода UDP NAT является использование сервера STUN . Я провел несколько быстрых поисков, чтобы увидеть, есть ли какие-либо компании, которые просто прямо предоставят вам решение для хостинга STUN, но если они вообще были, они были похоронены в кучах рекламы простого веб-хостинга.
К счастью, кажется, есть несколько серверов STUN, которые уже запущены и бесплатны для публичного использования. Список общедоступных серверов STUN можно найти по адресу voip-info.org .
Кроме того,
Я не вижу другого выбора, кроме как иметь выделенный сервер, на котором выполняется ваш код. Другие предлагаемые вами решения, скажем так, менее чем оптимальны.
Если вы начнете с малого, виртуальный хостинг подойдет. Затраты довольно минимальны.
Вместо полноценного выделенного сервера вы могли бы просто получить дешевую услугу общего хостинга и иметь интерфейс приложения со страницей PHP, которая, в свою очередь, взаимодействует с серверной частью базы данных MySQL.
Например, Lunarpages имеет стартовый пакет за 3 доллара в месяц, который включает 5 ГБ пространства и 50 ГБ полосы пропускания. Для чего-то такого простого, это все, что вам может понадобиться.
Затем ваше приложение просто опросит веб-страницу на предмет списка игр и отправит запрос POST, чтобы добавить свою игру в список.
Of Конечно, этот метод требует изучения PHP и MySQL, если вы их еще не знаете. И если вы сделаете это правильно, вы можете заставить страницу PHP войти в своего рода бесконечный цикл, чтобы соединение оставалось открытым и просто передавало обновления клиенту, вместо того, чтобы опрашивать страницу каждые несколько секунд и тратить много трафика. Однако это выходит за рамки этого ответа.
О, и если вы ищете что-то абсолютно бесплатное, поищите бесплатный хост PHP. Такие тоже есть! Даже с хостом, поддерживающим рекламу, ваше приложение может просто захватить страницу и игнорировать рекламу, когда вы анализируете список игр. Я знаю, что T35 когда-то был одним из моих любимых, потому что их бесплатный план не отслеживает пространство или пропускную способность (он ограничивает размер файла, чтобы исключить их использование в качестве общего ресурса мультимедиа, но он не должно быть проблемой для файлов PHP). Но, конечно, я думаю, что в долгосрочной перспективе вам будет лучше использовать платный хостинг.
Edit: T35 также говорит: «Бесплатный хостинг позволяет размещать 1 домен, а платный предлагает неограниченный хостинг для доменов». Так что вы даже можете просто заплатить за доменное имя и привязать его к ним! Я думаю, что в краткосрочной перспективе это ваш лучший (самый дешевый) выбор. Конечно, все это предполагает, что вы либо знаете, либо желаете изучить PHP, чтобы это произошло. :)
Промежуточным решением между размещением вашего собственного выделенного сервера и строго P2P сетевой средой является модель gnutella. В этой модели есть суперпользователей , которые действуют как локальные серверы, имея известные IP-адреса и подключенные (и, следовательно, имеющие информацию) к большему количеству клиентов, чем типичный одноранговый узел. Это по-прежнему требует, чтобы вы сами управляли хотя бы одним суперпером, но это дает вам возможность разрешить другим людям запускать своих собственных суперпользователей.
Нет ничего, что поддерживало бы каждое сетевое соединение. STUN, вероятно, хорош, UPnP может с этим работать.
Однако ходят слухи, что большинство межсетевых экранов можно соблазнить передать почти все что угодно через порт 53 UDP (DNS). Однако вам, возможно, придется поспорить с ОС по поводу вашего доступа к этому порту.
Также ознакомьтесь с SIP , это еще один протокол, предназначенный для такого рода вещей. С ростом популярности VOIP для этого может быть приличная встроенная поддержка в большем количестве брандмауэров.
Если вы действительно привержены UDP, вы можете также рассмотреть возможность его туннелирования через HTTP.
как насчет того, чтобы разбить проблему на две части - создать клиент сопоставления игр (отличный от игры), который может связываться через http с вашим дешевым / общим веб-хостом. Все игроки, которые хотят использовать функцию сопоставления игр, используют это. Затем клиент сопоставления игр запускает саму игру с правильными параметрами (IP и т.д.) после получения информации с вашего сервера.
Затем игра будет использовать стандартный способ пробивки UDP через NAT и т. Д. В соответствии с кодом вашей сети. На самом деле игре не нужно ничего знать о сопоставительном клиенте или сопоставительном сервере - в истинном смысле p2p (например, о торрентах, когда вы можете получить IP-адреса своих сверстников, вы даже можете отключиться от трекера).
Таким образом, ваш проблем становится меньше.