2017-12-02 5 views
1

Javaを使用する私のPCのローカルIPアドレスを検索しようとしました。しかし、結果は正しくありませんでした。具体的には、ipconfigコマンドからWireless LAN Adapter WiFi IPv4アドレスが必要です。私はthis excellent answerのような多くの異なる質問を見ましたが、Javaでこれをどうやって行うのかは明らかになりませんでした。 InetAddress.getLocalHost()は、間違ったIP( 'Ethernet-Adapter VirtualBox Host-Only Network')を返します。偽陽性のないローカルマシンのIPアドレスを見つける

Iは、次のコードを試みた:

public static List<String> getLocalIPAddresses() throws Exception 
{ 
    val networkInterfaces = NetworkInterface.getNetworkInterfaces(); 
    val localIPAddresses = new ArrayList<String>(); 

    while (networkInterfaces.hasMoreElements()) 
    { 
     for (val interfaceAddress : networkInterfaces.nextElement().getInterfaceAddresses()) 
     { 
      val address = interfaceAddress.getAddress(); 

      // Find the local IP addresses 
      if (address.isSiteLocalAddress()) 
      { 
       val localIPAddress = interfaceAddress.getAddress().toString().replace("/", ""); 
       localIPAddresses.add(localIPAddress); 
      } 
     } 
    } 

    if (localIPAddresses.isEmpty()) 
    { 
     throw new IllegalStateException("Expected the computer's local IP address but didn't get one!"); 
    } 

    return localIPAddresses; 
} 


valLombokからです。私のマシン上で

が、これは2つのIPアドレスのリストを返します。

192.168.56.1 
192.168.2.103 

「イーサネットアダプタのVirtualBoxホストオンリーネットワーク」1、正しい「ワイヤレスLANアダプタのWiFi」1。私はいつも後者を保証するために何ができますか?明らかにisSiteLocalAddress()(a.k.aローカルIPアドレス)を確認するだけでは不十分です。コードワイズでは他に何ができますか? 'VirtualBox'を除外することは、特にネットワークインターフェイス名が言語に依存するため、絶対的な解決策ではありません。

public static List<String> getLocalIPAddresses() throws Exception 
{ 
    val networkInterfaces = NetworkInterface.getNetworkInterfaces(); 
    val localIPAddresses = new ArrayList<String>(); 

    while (networkInterfaces.hasMoreElements()) 
    { 
     val networkInterface = networkInterfaces.nextElement(); 
     val displayName = networkInterface.getDisplayName(); 

     if (!displayName.contains("VirtualBox")) 
     { 
      for (val interfaceAddress : networkInterface.getInterfaceAddresses()) 
      { 
       val address = interfaceAddress.getAddress(); 

       // Find the local IP addresses 
       if (address.isSiteLocalAddress()) 
       { 
        val localIPAddress = interfaceAddress.getAddress().toString().replace("/", ""); 
        localIPAddresses.add(localIPAddress); 
       } 
      } 
     } 
    } 

    if (localIPAddresses.isEmpty()) 
    { 
     throw new IllegalStateException("Expected the computer's local IP address but didn't get one!"); 
    } 

    return localIPAddresses; 
} 

私はプラットフォームに依存しないソリューションが必要です。私はWindows上だけど。

+0

どちらのIPも同じnetworkInterfaceにありますか?そうでない場合は、interfaceをnetworkIntreface.isVirtual()などのブール値テストと区別できますか? –

+0

@MichaelMcKay: 'isVirtual()'チェックを含めても、コードは2つのIPを返します。彼らはそれぞれ異なるネットワークインターフェイス上にあります。 – BullyWiiPlaza

+0

"InetAddress.getLocalHost()が間違ったIPを返す"場合、それをforループでフィルタリングするために使用できますか? –

答えて

0

isVirtual()メソッドを使用しないでください。

static List<String> getLocalIpAddress() throws SocketException { 
    Enumeration<NetworkInterface> networkInterfaces = null; 
    List<String> localIpAddress = new ArrayList<String>(); 

    networkInterfaces = NetworkInterface.getNetworkInterfaces(); 

    while (networkInterfaces.hasMoreElements()) { 
     NetworkInterface ni = networkInterfaces.nextElement(); 
     System.out.println("=== <" + ni.getDisplayName() + "> ==="); 

     if (!ni.isUp()) { 
      for (InterfaceAddress addr : ni.getInterfaceAddresses()) { 
       System.out.println("not up : " + addr.getAddress().getHostAddress()); 
      } 
      continue; 
     } 
     if (ni.isLoopback()) { 
      for (InterfaceAddress addr : ni.getInterfaceAddresses()) { 
       System.out.println("loopback : " + addr.getAddress().getHostAddress()); 
      } 
      continue; 
     } 
     if (ni.isVirtual()) { 
      for (InterfaceAddress addr : ni.getInterfaceAddresses()) { 
       System.out.println("virtual : " + addr.getAddress().getHostAddress()); 
      } 
      continue; 
     } 

     if (!ni.isPointToPoint()) { 
      for (InterfaceAddress addr : ni.getInterfaceAddresses()) { 
       System.out.println("not ppp : " + addr.getAddress().getHostAddress()); 
      } 
      continue; 
     } 

     for (InterfaceAddress addr : ni.getInterfaceAddresses()) { 
      InetAddress address = addr.getAddress(); 
      if (address.isLinkLocalAddress()) { 
       System.out.println("link local address: " + address.getHostName() + address.getHostAddress()); 
       continue; 
      } 
      if (address.isSiteLocalAddress()) { 
       System.out.println("site local address: " + address.getHostName() + address.getHostAddress()); 
       continue; 
      } 

      System.out.println("getHostName: " + address.getHostName()); 
      System.out.println("getHostAddress : " + address.getHostAddress()); 
      System.out.println("------separator-------"); 

      localIpAddress.add(address.getHostAddress()); 
     } 
    } 

    return localIpAddress; 
} 
+0

両方のIPは 'not ppp:'として出力され、そうでない場合は全く印刷されません。 – BullyWiiPlaza

関連する問題