Создать клиент-серверное приложение в 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-адреса при каждой перезагрузке компьютера