Создайте клиент-серверное приложение в Java, где обе машины могут иметь динамические IP-адреса

StackOverflow https://stackoverflow.com/questions/3697878

  •  02-10-2019
  •  | 
  •  

Вопрос

Это то, что я планирую сделать. Предположим, что есть 2 машины A и B. Мне нужно создать приложение, с помощью которого машина A может отправлять данные на машину B, используя Java SE.

Я знаю, что для создания подключения необходимо создать объект класса сервеса и использовать метод ACCECT () как

В машине B:Serversocket SS = новый сервес (12000);

в то время как (правда)

{

Socke S = SS.Accept ();

      .
      .
      .
      .

}

В машине A:

Socket S = новая розетка (»IP-адрес машины B>",12000);

                .
                .
                .
                .

Вот проблема.

Предположим, если IP-адрес машины B назначен динамически с DHCP, т.е. это может измениться каждый раз, когда машина перезагружается.

Есть ли какие-либо способы, с помощью которого Java PGM в машине A может распознать IP-адрес B без пользователей, набрав его вручную ???

Надеясь, что вы понятный вопрос. Ожидание ответов!

Это было полезно?

Решение

У большинства DNS-серверов есть механизм, который позволяет DHCP-серверу сделать динамические обновления в локальную (внутреннюю) зону. Если в вашем распоряжении эта функция в вашем распоряжении, вы можете просто использовать DNS-имена и позволяют системам ребята, убедившись, что записи DNS актуальны с арендой DHCP.

Подобный DNS-подход может быть достигнут на более широком интернете, используя службу DDNS, как Дынднс.

Если вы не можете использовать DNS, то вы застряли с подходом на основе вещания UDP. Это тот же механизм, который протоколы, такие как DHCP, Bonjour и SMB, используют другие компьютеры в локальной сети, не зная их адресов; И этот подход будет работать только в одних и тех же контекстах, где работают эти технологии (как правило, только в локальной сети, и, безусловно, не через больший Интернет).

В Java вы достигли бы обмена сообщениями на UDP через Datagagramsocket. класс.

Цитируя документы API:

Распространения UDP отправляет всегда включены в Datagramsocket. Для получения широковещательных пакетов Datagramsocket должен быть связан с адресом подстановки. В некоторых реализациях широковещательные пакеты также могут быть получены, когда datagramsocket связан с более конкретным адресом.

Пример:

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress(8888)); 

Который эквивалентно:

DatagramSocket s = new DatagramSocket(8888); 

Оба случая создадут Datagramsocket, способный получать широковещательные вещания на UDP Port 8888.

Если ваши две машины расположены в разрозненных местах в Интернете, и вы не можете использовать службу DDNS (например, Dyndns, упомянутые выше), то ваша лучшая ставка - это создание центрального сервера регистрации. Это будет простой сервер (даже может быть веб-службой), который работает по известному адресу в Интернете. Каждый из ваших клиентских машин будет зарегистрироваться в центральном регистрационном сервере, таким образом, центральный регистрационный сервер будет знать IP-адреса обеих машин. Затем каждая машина может запросить адрес другого через центральный сервер регистрации. Вам придется подумать о безопасности, чтобы защитить против злонамеренного «отравления» вашего реестра, но иначе это было бы довольно прямо вперед.


РЕДАКТИРОВАТЬ:

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

На самом деле, это выглядит как подпроект P2PSockets. имеет именно то, что вы хотите.

Другие советы

В Java вы можете вычислить IP-адрес машины по имени хоста, вот код

 java.net.InetAddress inetAdd = java.net.InetAddress.getByName("www.ibm.com");
 System.out.println("IP Address is : " + inetAdd.getHostAddress());

Используйте этот код, чтобы получить измененный IP-адрес каждый раз перезагрузки машины

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top