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