ほとんどのDNSサーバーには、DHCPサーバーがローカル(内部)ゾーンを動的に更新できるようにするメカニズムがあります。この機能を自由に使用できる場合は、DNS名を使用するだけで、システム担当者にDNSレコードがDHCPリースで最新であることを確認させることができます。
同様のDNSベースのアプローチは、dyndnsなどのDDNSサービスを使用してより広いインターネットで実現できます。
DNSを使用できない場合は、UDPブロードキャストベースのアプローチで立ち往生しています。これは、DHCP、bonjour、SMBなどのプロトコルが、アドレスを知らなくてもローカルネットワーク上の他のコンピューターを見つけるために使用するのと同じメカニズムです。このアプローチは、これらのテクノロジーが機能するのと同じコンテキストでのみ機能します(通常、ローカルネットワーク内でのみ機能し、より大きなインターネット全体では機能しません)。
Javaでは、DatagramSocketクラスを介してUDPブロードキャストメッセージングを実行します。
APIドキュメントの引用:
UDPブロードキャスト送信は、DatagramSocketで常に有効になっています。ブロードキャストパケットを受信するには、DatagramSocketをワイルドカードアドレスにバインドする必要があります。一部の実装では、DatagramSocketがより具体的なアドレスにバインドされている場合にも、ブロードキャストパケットを受信することがあります。
例:
DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress(8888));
これは次と同等です:
DatagramSocket s = new DatagramSocket(8888);
どちらの場合も、UDPポート8888でブロードキャストを受信できるDatagramSocketが作成されます。\
2台のマシンがインターネット上の異なる場所にあり、DDNSサービス(上記のdyndnsなど)を使用できない場合、最善の策は中央登録サーバーを構築することです。これは、インターネット上の既知のアドレスで実行される単純なサーバー(Webサービスの場合もあります)になります。各クライアントマシンは中央登録サーバーに登録されるため、中央登録サーバーは両方のマシンのIPアドレスを認識します。次に、各マシンは中央登録サーバーを介して他のマシンのアドレスを要求できます。レジストリの悪意のある「中毒」から保護するために、セキュリティについていくらか考慮する必要がありますが、そうでなければ、これはかなり簡単です。
編集:
JXTAを発見しました。これは、ピアツーピアネットワーク機能を備えたJavaアプリケーションを構築するためのツールのセットです。私はそれを直接経験したことはありませんが、それはあなたが探しているものを達成するように見えます(そしておそらくそれをすべてゼロから構築する必要があるよりも多くの作業を節約できます)。
実際、サブプロジェクトp2psocketsはまさにあなたが望むことをしているように見えます。