2016-12-01 132 views
3

关于此link使用提供的代码来生成IP地址。Java获取IPv4地址

String ip; 
    try { 
     Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); 
     while (interfaces.hasMoreElements()) { 
      NetworkInterface iface = interfaces.nextElement(); 
      // filters out 127.0.0.1 and inactive interfaces 
      if (iface.isLoopback() || !iface.isUp()) 
       continue; 

      Enumeration<InetAddress> addresses = iface.getInetAddresses(); 
      while(addresses.hasMoreElements()) { 
       InetAddress addr = addresses.nextElement(); 
       ip = addr.getHostAddress(); 
       System.out.println(iface.getDisplayName() + " " + ip); 
      } 
     } 
    } catch (SocketException e) { 
     throw new RuntimeException(e); 
    } 

我实现精确的代码来获得IP地址,但它同时提供了IPv4和IPv6地址。以下是产生的价值。

Qualcomm Atheros AR5BWB222 Wireless Network Adapter 192.168.1.5 
Qualcomm Atheros AR5BWB222 Wireless Network Adapter fe80:0:0:0:a874:xxxx:xxxx:9150%wlan0 

(IPv6地址删节)

有什么办法,我只能得到IPv4的价值,而不是两者兼而有之?

回答

6

您可以检查addr对象的类型以查看它是否为Inet4AddressInet6Address实例。

例如:

String ip; 
try { 
    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); 
    while (interfaces.hasMoreElements()) { 
     NetworkInterface iface = interfaces.nextElement(); 
     // filters out 127.0.0.1 and inactive interfaces 
     if (iface.isLoopback() || !iface.isUp()) 
      continue; 

     Enumeration<InetAddress> addresses = iface.getInetAddresses(); 
     while(addresses.hasMoreElements()) { 
      InetAddress addr = addresses.nextElement(); 

      // *EDIT* 
      if (addr instanceof Inet6Address) continue; 

      ip = addr.getHostAddress(); 
      System.out.println(iface.getDisplayName() + " " + ip); 
     } 
    } 
} catch (SocketException e) { 
    throw new RuntimeException(e); 
}