両方のマシンが動的なIPアドレスを持つことができるJavaでクライアントサーバーアプリケーションを作成する
-
02-10-2019 - |
質問
これが私がやろうとしていることです。 2つのマシンAとBがあるとします。MavaSを使用して、マシンAがマシンBにデータを送信できるアプリケーションを作成する必要があります。
接続を作成するには、Serversocketクラスのオブジェクトを作成し、Accept()メソッドを次のように使用する必要があることを知っています。
マシンB:Serversocket SS = new Serversocket(12000);
while(true)
{
Socket S = ss.Accept();
.
.
.
.
}
マシンA:
ソケットS = new Socket( "マシンBのIPアドレス>",12000);
.
.
.
.
これが問題です。
ifと仮定します マシンBのIPアドレスはDHCPで動的に割り当てられます, 、つまり、マシンが再起動するたびに変更できます。
マシンAのJava PGM Aが、ユーザーが手動で入力することなくBのIPアドレスを認識できる方法はありますか?
あなたが質問が明確であることを願っています。返信を待っています!
解決
ほとんどのDNSサーバーには、DHCPサーバーがローカル(内部)ゾーンに動的な更新を行うことができるメカニズムがあります。この機能を自由に使用できる場合は、DNS名を使用するだけで、システムの人にDNSレコードがDHCPリースで最新であることを確認できます。
同様のDNSベースのアプローチは、DDNSサービスを使用して、より広いインターネットで達成できます dyndns.
DNSを使用できない場合は、UDPブロードキャストベースのアプローチに固執しています。これは、DHCP、Bonjour、SMBなどのプロトコルが、アドレスを知らずにローカルネットワーク上の他のコンピューターを見つけるために使用するのと同じメカニズムです。また、このアプローチは、これらのテクノロジーが機能するのと同じコンテキストでのみ機能します(通常、ローカルネットワーク内でのみ、間違いなく大きなインターネット全体ではありません)。
Javaでは、UDPブロードキャストメッセージングを介して達成します datagramsocket クラス。
APIドキュメントの引用:
UDPブロードキャスト送信は、常にデータグラムソケットで有効になります。ブロードキャストパケットを受信するには、データグラムソケットをワイルドカードアドレスにバインドする必要があります。いくつかの実装では、データグラムソケットがより具体的なアドレスにバインドされている場合、ブロードキャストパケットが受信される場合があります。
例:
DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888));
これは次のとおりです。
DatagramSocket s = new DatagramSocket(8888);
どちらの場合も、UDPポート8888でブロードキャストを受信できるデータグラムソケットを作成します。
2つのマシンがインターネット上の異なる場所に配置されており、DDNSサービス(上記のDyndnsなど)を使用できない場合、最善の策は中央登録サーバーを構築することです。これは、インターネット上の既知のアドレスで実行される単純なサーバー(Webサービスになることもあります)になります。各クライアントマシンは、中央登録サーバーに登録するため、中央登録サーバーは両方のマシンのIPアドレスを知っています。その後、各マシンは、中央登録サーバーを介して相手のアドレスを要求できます。レジストリの悪意のある「中毒」から保護するために、セキュリティに何らかの考えを置く必要がありますが、そうでなければ、これはかなり簡単です。
編集:
私はちょうど発見しました Jxta. 。これは、ピアツーピアネットワーキング機能を備えたJavaアプリケーションを構築するためのツールのセットです。私はそれについて直接的な経験を持っていませんが、それはあなたが探しているものを達成するように見えます(そしておそらくそれをすべてゼロから構築する必要があるという多くの仕事を救います)。
実際、サブプロジェクトのように見えます p2psockets あなたが望むことを正確に行います。
他のヒント
Javaでは、ホスト名でマシンのIPアドレスを計算できます。コードは次のとおりです。
java.net.InetAddress inetAdd = java.net.InetAddress.getByName("www.ibm.com");
System.out.println("IP Address is : " + inetAdd.getHostAddress());
このコードを使用して、マシンの再起動のたびに変更されたIPアドレスを取得します