Тайм-аут Сокетов Java по Интернету

Я создал маленькую программу чата, которая работает безупречно, когда клиент и сервер выполняются на том же компьютере (и вероятно сеть, также). Однако, как только я пытаюсь соединиться с другим компьютером по Интернету, сокетное соединение просто испытывает таймаут. Это из-за брандмауэров / маршрутизаторы и т.д.?

И как я могу соединить ServerSocket & Socket по Интернету?

6
задан Basil Bourque 28 August 2018 в 21:21
поделиться

4 ответа

Однако, как только я пытаюсь подключиться к другому компьютеру через Интернет, разъем просто раз разумеется. Это из-за брандмауэров / роутеров и т. Д.?

Да, скорее всего. Вы работаете в проблеме NAT : по сути, одинаково видимый внешне видимый IP-адрес карты для многих внутренне видимых конечных точек, а внешняя конечная точка не знает, какую внутреннюю конечную точку дарить ваш сокет.

Самый простой способ вокруг этого состоит в том, чтобы оба ваши клиенты соединяются с третьей стороной, которую оба могут видеть , а затем у вас сторонняя сторона посреднила связь. Это как большинство протоколов мгновенных сообщений работают, например.

Если у вас нет способа контролировать третье лицо, например, альтернативу напрямую подключить двух клиентов, чтобы оба клиента открывали согласованные порта, а затем отображать коммуникацию на этом порту к своей собственной внутренней конечной точке. Отказ Это обеспечивает отсутствующую ссылку, что внешне видимая конечная точка (например, ваш домашний маршрутизатор) должен доставлять связь до предполагаемого назначения.

5
ответ дан 17 December 2019 в 00:09
поделиться
[11388926-

Если ваш сервер находится за коробкой маршрутизатора NAT (и большинство домашних компьютеров, особенно если вы используете WiFi), то он не будет доступен снаружи, если вы не настроете свой роутер порт вперед на этот сервер.

Что такое IP вашего сервера? Если это 192.168.x.x или 10.x.x.x, то это не маршрутный адрес и не может быть достигнут снаружи.

1
ответ дан 17 December 2019 в 00:09
поделиться
- 4378923-

Предполагая, что при запуске на одном компьютере вы имеете в виду, что вы говорите клиенту сервер в 127.0.0.1 / localhost, это не должно быть проблемой в вашем коде, а из-за брандмауэров или маршрутистов Отказ Если ваш сервер находится за маршрутизатором, выполняющим Masquerading (т. Е. У сервера нет публичного, но частный IP-адрес, например 192.168.xy Например), вы должны настроить маршрутизатор для передачи соединения из Интернета к компьютеру, запущенным сервер.

Другая причина, по которой не работает, может быть, как вы связываете свой сервер к интерфейсу. Если вы укажете 127.0.0.1 Там, сервер будет прослушивать только запросы, исходящие из той же системы. Если вы не укажете адрес, он будет слушать все интерфейсы.

Редактировать Ваш комментарий указывает, что вы действительно имеете проблему NAT, как другие, сказали. Настройка вашего маршрутизатора соответственно является самым простым решением.

1
ответ дан 17 December 2019 в 00:09
поделиться

Во-первых, тест, чтобы увидеть, действительно ли он работает на локальной сети; Похоже, вы просто предполагаете, что это делает.

Если он работает в вашей локальной сети, возможно, он не может, поскольку сервер не хватает публичного IP и работает за маршрутизатором Nat'ing.

0
ответ дан 17 December 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: