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

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

Я знаю, что для установления соединения вам нужно создать объект класса serversocket и использовать метод accept() как

На компьютере B: ServerSocket ss = новый ServerSocket(12000);

в то время как (истина)

{

Сокет s = ss.accept();

      .
      .
      .
      .

}

В машине А:

Socket s = новый Socket("< IP-адрес компьютера B>",12000);

                .
                .
                .
                .

Здесь проблема.

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

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

Надеюсь, что вам вопрос ясен. Жду ответов!

2 ответа

Решение

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

Подобный подход на основе DNS может быть реализован в более широком Интернете с использованием службы DDNS, такой как dyndns.

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

В Java вы могли бы осуществлять широковещательный обмен UDP через класс DatagramSocket.

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

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

Пример:

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

Что эквивалентно:

DatagramSocket s = new DatagramSocket(8888); 

В обоих случаях будет создан DatagramSocket, способный принимать широковещательные сообщения через UDP-порт 8888.\

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


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

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

На самом деле, похоже, что подпроект p2psockets делает именно то, что вы хотите.

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

java.net.InetAddress inetAdd = java.net.InetAddress.getByName("www.ibm.com"); System.out.println ("IP-адрес: " + inetAdd.getHostAddress());

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

Другие вопросы по тегам