4

これは私がやろうとしていることです。2 台のマシン A と B があるとします。Java SE を使用して、マシン A がマシン B にデータを送信できるアプリケーションを作成する必要があります。

接続を確立するには、serversocket クラスのオブジェクトを作成し、accept() メソッドを次のように使用する必要があることを知っています。

マシン B: ServerSocket ss=new ServerSocket(12000);

while(真)

{

ソケット s=ss.accept();

      .
      .
      .
      .

}

マシン A:

Socket s=new Socket("<マシンBのIPアドレス>",12000);

                .
                .
                .
                .

これが問題です。

マシンB の IP アドレスが DHCPで動的に割り当てられているとします。つまり、マシンが再起動するたびに変更される可能性があります。

ユーザーが手動で入力しなくても、マシン A の Java Pgm が B の IP アドレスを認識できる方法はありますか?

質問が明確であることを願っています。返信を待っています!

4

2 に答える 2

3

ほとんどの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はまさにあなたが望むことをしているように見えます。

于 2010-09-13T05:15:37.890 に答える
3

Java では、マシンの IP アドレスをホスト名で計算できます。コードは次のとおりです。

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

このコードを使用して、マシンが再起動するたびに変更された IP アドレスを取得します

于 2010-09-13T06:06:34.123 に答える