Большинство 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 делает именно то, что вы хотите.