Javaを使用して現在のマシンのIPアドレスを取得する質問する

Javaを使用して現在のマシンのIPアドレスを取得する質問する

異なるシステム上または同じシステム上の異なるポート上で実行される異なるノードがあるシステムを開発しようとしています。

ここで、すべてのノードは、ブートストラップ ノードと呼ばれる特別なノードの IP をターゲット IP として持つソケットを作成します。次に、ノードは独自のソケットを作成しServerSocket、接続のリッスンを開始します。

ブートストラップ ノードはノードのリストを保持し、クエリされるとそれらを返します。

ここで必要なのは、ノードが IP をブートストラップ ノードに登録する必要があることです。cli.getInetAddress()クライアントがServerSocketブートストラップ ノードに接続すると使用しようとしましたが、機能しませんでした。

  1. 利用可能な場合はクライアントに PPP IP を登録してもらう必要があります。
  2. それ以外の場合は、LAN IP(使用可能な場合)。
  3. それ以外の場合は、同じコンピューターであると仮定して 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 アドレスのうちどれが最も適切かを選別できます。

おすすめ記事