異なるシステム上または同じシステム上の異なるポート上で実行される異なるノードがあるシステムを開発しようとしています。
ここで、すべてのノードは、ブートストラップ ノードと呼ばれる特別なノードの IP をターゲット IP として持つソケットを作成します。次に、ノードは独自のソケットを作成しServerSocket
、接続のリッスンを開始します。
ブートストラップ ノードはノードのリストを保持し、クエリされるとそれらを返します。
ここで必要なのは、ノードが IP をブートストラップ ノードに登録する必要があることです。cli.getInetAddress()
クライアントがServerSocket
ブートストラップ ノードに接続すると使用しようとしましたが、機能しませんでした。
- 利用可能な場合はクライアントに PPP IP を登録してもらう必要があります。
- それ以外の場合は、LAN IP(使用可能な場合)。
- それ以外の場合は、同じコンピューターであると仮定して 127.0.0.1 を登録する必要があります。
コードの使用:
System.out.println(Inet4Address.getLocalHost().getHostAddress());
または
System.out.println(InetAddress.getLocalHost().getHostAddress());
私の PPP 接続 IP アドレスは 117.204.44.192 ですが、上記の例では 192.168.1.2 が返されます。
編集
次のコードを使用しています:
Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
NetworkInterface n = (NetworkInterface) e.nextElement();
Enumeration ee = n.getInetAddresses();
while (ee.hasMoreElements())
{
InetAddress i = (InetAddress) ee.nextElement();
System.out.println(i.getHostAddress());
}
}
すべての s に関連付けられたすべての IP アドレスを取得できますNetworkInterface
が、それらをどのように区別すればよいでしょうか? 取得する出力は次のとおりです。
127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19
ベストアンサー1
最も一般的なケースでは、これは少し難しいかもしれません。
一見すると、InetAddress.getLocalHost()
このホストの IP アドレスがわかるはずです。問題は、ホストには多数のネットワーク インターフェイスがあり、インターフェイスが複数の IP アドレスにバインドされる可能性があることです。さらに、すべての IP アドレスがマシンまたは LAN の外部からアクセスできるわけではありません。たとえば、仮想ネットワーク デバイスの IP アドレスやプライベート ネットワークの IP アドレスなどです。
つまり、返された IP アドレスは、InetAddress.getLocalHost()
使用に適したものではない可能性があります。
これにどう対処すればいいでしょうか?
- 1 つの方法は、
NetworkInterface.getNetworkInterfaces()
ホスト上の既知のネットワーク インターフェイスをすべて取得し、各 NI のアドレスを反復処理することです。 - もう 1 つの方法は、ホストの外部にアドバタイズされた FQDN を (何らかの方法で) 取得し、それを使用して
InetAddress.getByName()
プライマリ IP アドレスを検索することです。(ただし、それをどのように取得し、DNS ベースのロード バランサーをどのように処理するのでしょうか?) - 前述のバリエーションとして、設定ファイルまたはコマンド ライン パラメータから優先 FQDN を取得する方法があります。
- 別のバリエーションとしては、設定ファイルまたはコマンドラインパラメータから優先 IP アドレスを取得する方法があります。
要約すると、InetAddress.getLocalHost()
通常は機能しますが、コードが「複雑な」ネットワーク環境で実行される場合には、代替の方法を提供する必要がある場合があります。
すべてのネットワーク インターフェイスに関連付けられたすべての IP アドレスを取得することはできますが、それらをどのように区別すればよいでしょうか?
- 127.xxx.xxx.xxx の範囲内のアドレスはすべて「ループバック」アドレスです。これは「この」ホストにのみ表示されます。
- 192.168.xxx.xxx の範囲内のアドレスはすべてプライベート (サイト ローカル) IP アドレスです。これらは組織内での使用のために予約されています。10.xxx.xxx.xxx アドレス、および 172.16.xxx.xxx から 172.31.xxx.xxx までも同様です。
- 169.254.xxx.xxx の範囲のアドレスはリンク ローカル IP アドレスです。これらは単一のネットワーク セグメントで使用するために予約されています。
- 224.xxx.xxx.xxx から 239.xxx.xxx.xxx までの範囲のアドレスはマルチキャスト アドレスです。
- アドレス 255.255.255.255 はブロードキャスト アドレスです。
- それ以外の場合は、有効なパブリック ポイントツーポイント IPv4 アドレスである必要があります。
実際、InetAddress API は、ループバック、リンク ローカル、サイト ローカル、マルチキャスト、ブロードキャスト アドレスをテストするためのメソッドを提供します。これらを使用して、返される IP アドレスのうちどれが最も適切かを選別できます。