Помогите общаться с сокетами через nat - PullRequest
3 голосов
/ 16 декабря 2010

Я хочу сделать простой P2P-мессенджер в Java, мне удалось связаться с 2 компьютерами в одной сети, но когда я пытаюсь отправить сообщение на другой компьютер из-за пределов сети, сообщение исчезает ... Язнаю, что я мог бы делать пересылки в маршрутизаторе, но я не хочу этого делать, я хочу сделать это так, как Yahoo, gtalk или другие серверы им.Я думаю, что они используют систему nat для этого, но я не очень хорошо знаю, как: D.

Кто-то, кто может объяснить мне, как работает NAT, и если это способ решения моей проблемы?

Я прочитал, что мне нужен статический и публичный IP для сервера, и когда клиент (с частным IP) отправляет запрос на сервер, его NAT будет знать, что делать с сообщением, которое придетс сервера в следующий раз ... но если клиент не отправляет пакет на сервер, а сервер отправляет пакет клиенту, то NAT не знает, куда отправить пакет внутри сети (клиенту).

Это правильно, что я думаю?

Большое спасибо!

Ответы [ 3 ]

5 голосов
/ 16 декабря 2010

Вы почти правы в своем описании NAT.Единственная ошибка, которую вы допустили, это то, что указал Питер: клиент всегда является тем, кто инициирует соединение.

Теперь, если обе стороны имеют публичные IP-адреса, все в порядке, и любая сторона может быть сервером.

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

И, наконец, если обе стороны находятся за NAT, создается впечатление, что установить соединение невозможно, но на самом деле это не всегда так.,Есть одна хитрость, которая называется " дырокол ".Это разновидность белой магии, и она не всегда работает, но работает достаточно часто, чтобы ее можно было успешно использовать, например, в Skype.

0 голосов
/ 16 декабря 2010

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

  • Каждый клиент должен иметь публичный IP-адрес, чтобы другие клиенты могли с ним связаться. Каждый клиент должен также действовать как клиент и сервер.
  • Найти клиентов будет очень сложно, так как вам необходимо знать их IP-адреса

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

0 голосов
/ 16 декабря 2010

Клиент по определению инициирует запрос, сервер обслуживает этот запрос и отправляет обратно ответ. Предполагается, что клиентам можно доверять для создания сетевых подключений, а серверам - нет. Кстати: в некоторых сетях клиентам даже не доверяют, и они должны использовать прокси.

повторяю; клиент - это тот, кто создает соединение, будь то в вашей сети или в Интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...