web-dev-qa-db-ja.com

JavaローカルIPを取得

ローカルIPを取得しようとしています。動作するはずです

System.out.println(Inet4Address.getLocalHost().getHostAddress());

または

InetAddress addr = InetAddress.getLocalHost();
ip = addr.getHostAddress();
System.out.println("Ip: " + ip);

しかし、常に192.168.178.154ではなく192.168.178.119を返します(これは私の実際のローカルIP(Terminal-> ifconfig))

私は何をすべきか?

22
Nico Hauser

2つのIPアドレスがあるように聞こえます。

ネットワークアダプターが1つあるコンピューターでは、選択されるIPアドレスは、コンピューターのネットワークアダプターのプライマリIPアドレスです。ただし、マルチホームコンピューターでは、スタックが最初に選択する必要があります。スタックは、接続のターゲットIPアドレスを認識するまで、インテリジェントな選択を行うことができません。

プログラムがconnect()呼び出しをターゲットIPアドレスに送信するか、send()呼び出しをUDPデータグラムに送信すると、スタックはターゲットIPアドレスを参照し、最適なネットワークを選択できるようにIPルートテーブルを調べます。パケットを送信するアダプタ。このネットワークアダプターが選択されると、スタックはそのネットワークアダプターに関連付けられたプライマリIPアドレスを読み取り、そのIPアドレスを送信パケットのソースIPアドレスとして使用します。

ドキュメント

2番目のIPとそのLANなどをアクティブにする場合は、それを取り外し、10秒後に再び接続します。他のIPは、ルーティングテーブルでホストIPとして選択される場合があります。

getNetworkInterfacesから2番目のIPを取得できます。

次のコードを実行してみてください:

public static void main(String[] args) throws Exception
{
    System.out.println("Your Host addr: " + InetAddress.getLocalHost().getHostAddress());  // often returns "127.0.0.1"
    Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces();
    for (; n.hasMoreElements();)
    {
        NetworkInterface e = n.nextElement();

        Enumeration<InetAddress> a = e.getInetAddresses();
        for (; a.hasMoreElements();)
        {
            InetAddress addr = a.nextElement();
            System.out.println("  " + addr.getHostAddress());
        }
    }
} 
33
Maxim Shoustin

システムが複数のIPで構成されている場合は、このようにします。

try {
  InetAddress inet = InetAddress.getLocalHost();
  InetAddress[] ips = InetAddress.getAllByName(inet.getCanonicalHostName());
  if (ips  != null ) {
    for (int i = 0; i < ips.length; i++) {
      System.out.println(ips[i]);
    }
  }
} catch (UnknownHostException e) {

}
7
Prabhakaran