Переадресация портов Java Socket - PullRequest
4 голосов
/ 17 ноября 2011

Я сделал сетевую игру на Java с использованием сокетов. Это прекрасно работает, кроме ... только через мою локальную сеть. : / То, что я хочу сделать, это настроить его так, чтобы я мог запустить сервер, работающий на моем домашнем компьютере, и отправить клиентский код в исполняемом фляге кому-то другому, чтобы они могли его запустить и подключиться через интернет. Но, как ... Я не знаю, как настроить мой модем и маршрутизатор для этого. :( У меня есть беспроводной модем Clear, для которого страница конфигурации выглядит следующим образом:

http://imageshack.us/photo/my-images/254/modem.jpg

И маршрутизатор Netgear, чья страница выглядит так:

http://imageshack.us/photo/my-images/443/routerq.jpg

Прямо сейчас в классах клиента и сервера я передаю частный IP-адрес моего компьютера вместе с выбранным номером порта объектам ServerSocket и Socket. Я слышал, что сокеты могут быть UDP или TCP, в зависимости от того, как вы их настроили, или что-то ...? Я ничего такого не делаю, просто создаю их экземпляры и передаю им 2 значения, и они уходят ...

В коде для сервера:

ServerSocket sock = new ServerSocket();
sock.bind(new InetSocketAddress(IP, 9001));

Код для клиента:

Socket sock = new Socket(IP, 9001);

Так же, мне нужно знать, как изменить код в соответствии с изменениями настроек маршрутизатора / модема.

«IP» - это строка, представляющая частный IP моего компьютера, 192.168.1.10, и программа работает только в том случае, если это строка, которую я передаю Socket & ServerSocket. Как я уже сказал, у меня есть модем, который подключен к маршрутизатору, который подключен к моему компьютеру. Итак, кто-то может объяснить мне (подробно, потому что я нуб), что именно мне нужно сделать, чтобы настроить их обоих, И изменения, которые я должен был бы внести в мой код?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Вам придется вручную перенаправить порт или посмотреть на решение, такое как UPnP или NAT-PMP, для автоматической переадресации портов.К сожалению, NAT - трудная задача для настройки, и большинство маршрутизаторов не поддерживают его должным образом.Это также не простая задача, так как вам необходимо поддерживать целый ряд различных реализаций и механизмов.

Не должно быть слишком сложно настроить маршрутизатор для перенаправления одного порта на вашу машину.См. http://portforward.com/, чтобы узнать, как это сделать практически на любом маршрутизаторе.

0 голосов
/ 17 ноября 2011

Звучит так, будто вы задаете здесь несколько вопросов ... Я не специалист по сетевому / сокетному программированию, но вот несколько идей.

Что касается дистрибуции, вы можете посмотреть Java Web Start .Ваши клиенты смогут легко получить приложение, а также автоматизировать обновления.

Если вы используете такой конструктор Socket, фактической реализацией будет системная настройка по умолчанию.Вы можете переопределить это, вызвав этот метод с подходящей реализацией SocketImplFactory.

Что касается IP-адреса и порта ... Использование жестко заданного значения для порта должно быть в порядке,Вам нужно будет выбрать порт или, по крайней мере, какой-нибудь вариант по умолчанию для подключения клиентов.Тем не менее, может быть полезно прочитать значение из некоторого внешнего файла конфигурации.Это облегчит задачу, если вы когда-нибудь решите распространять серверное приложение, чтобы другие люди могли запускать серверы.Возможно, они захотят использовать другой порт.

Жестко запрограммированный в коде IP-адрес (ваш) сервера, безусловно, не запрещен.Клиенты должны подключаться, используя либо IP-адрес, либо имя хоста, которое они должны предоставить или установить в каком-либо файле конфигурации.Имя хоста потребуется, если у вас нет статического IP-адреса.

Если это не то, что вам и вашим друзьям понравится, где вы всегда можете просто начать игру, указав IP и порт всеанс чата или что-то в этом роде, вам лучше найти решение для внешнего хостинга в компании, которая позаботится о разрешении DNS и настройке сети.В наши дни вы найдете такие вещи довольно дешевыми, если у вас нет таких требований, как сервер или база данных Java EE.

РЕДАКТИРОВАТЬ: подумайте о чем-то другом.TCP может подойти для вашего случая использования, но если это игра, требующая минимальной задержки и быстрой синхронизации ввода (например, стрелялка или файтинг), то это не лучший выбор.В этом случае UDP будет лучше.Это вызвало бы необходимость добавления какого-либо рода обнаружения для рассинхронизации или механизма, который компенсирует любые отброшенные пакеты.

...