создать клиент-серверное приложение в java, где обе машины могут иметь динамические IP-адреса - PullRequest
4 голосов
/ 13 сентября 2010

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

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

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

while (true)

{

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

      .
      .
      .
      .

}

в машине A:

Сокет s = новый разъем ("<<strong> IP-адрес устройства B >", 12000);

                .
                .
                .
                .

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 13 сентября 2010

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

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

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

3 голосов
/ 13 сентября 2010

Большинство 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-адреса обеих машин. Затем каждая машина может запросить адрес другого через центральный сервер регистрации. Чтобы защитить себя от злонамеренного «отравления» вашего реестра, вам придется подумать о безопасности, но в противном случае это будет довольно просто.


EDIT:

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

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

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