我开始倾向于通过Java获取IP地址。我知道一台机器可以通过不同的网络接口拥有各种IP,所以我对我发现的一些示例代码感到有些困惑,这些代码似乎返回了“首选”IP地址(首选每Windows 7命令行ipconfig / all)。
当我在本地计算机上运行以下代码时,会返回26个NetworkInterface对象,其中一些包含多个InetAddress对象(包括“Preferred”对象):
Enumeration<NetworkInterface> eNI = null;
NetworkInterface ni = null;
Enumeration<InetAddress> eIA = null;
InetAddress ia = null;
try {
eNI = NetworkInterface.getNetworkInterfaces();
} catch (Exception e) {
}
while (eNI.hasMoreElements()) {
ni = eNI.nextElement();
System.out.println("NtwkIntfc name: " + ni.getName());
System.out.println("NtwkIntfc disp name: " + ni.getDisplayName());
try {
System.out.println("NtwkIntfc hardware addr: " + Hex.encodeHexString(ni.getHardwareAddress()));
} catch (Exception e) {
}
eIA = ni.getInetAddresses();
while (eIA.hasMoreElements()) {
ia = eIA.nextElement();
System.out.println("InetAddress host address: " + ia.getHostAddress());
System.out.println("InetAddress host name: " + ia.getHostName());
}
}
然而,这个更简单的代码只返回“首选”IPv4地址:
try {
InetAddress thisIp = InetAddress.getLocalHost();
System.out.println("IP:" + thisIp.getHostAddress());
} catch (Exception e) {
e.printStackTrace();
}
我似乎无法找到将其标识为“Preferred”的NetworkInterface(和InetAddress)属性/方法,所以我想知道类方法InetAddress.getLocalHost()是如何做到的?此外,这种首选IP是标准网络概念还是某种类型的Windows特定概念?
感谢。
答案 0 :(得分:2)
查看网络设置中的指标。另请参阅windows 7命令行下的“route print”。我认为度量越低,适配器越“优先”。
答案 1 :(得分:0)
查看InetAddress.getLocalHost()的源代码。
简而言之,它获取绑定到主机名的IP地址,并返回返回的IP地址数组中的第一个条目。
我没有看到任何特定于首选的内容,除了它是映射到机器主机名的地址(注意机器也可以有多个名称)
答案 2 :(得分:0)
我认为'Preferred'可能会以某种方式引用路由表中最常见的条目。谁知道那些Windows疯狂的想法。
但是,该地址也可能对应于最有可能是DHCP分配的公共IP的地址。如果您正在寻找能够公开/用于打开端口的最可能地址的代码,这就是我用来获取IPv4地址的内容:
public static InetAddress getNetworkAddr() {
InetAddress localAddr = null;
// Find our public IP address
Enumeration<NetworkInterface> netInterfaces;
try {
netInterfaces = NetworkInterface.getNetworkInterfaces();
while (netInterfaces.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();
Enumeration<InetAddress> addresses = ni.getInetAddresses();
while( addresses.hasMoreElements() ) {
InetAddress addr = addresses.nextElement();
// System.out.println("Checking out " + ni.getName() + " with address " + addr.toString());
if (!addr.isSiteLocalAddress() &&
!addr.isLoopbackAddress() &&
!addr.isLinkLocalAddress() &&
addr.getHostAddress().indexOf(":") == -1) { // MAC/IPv6 address detection
System.out.println("Interface " + ni.getName()
+ " seems to be InternetInterface. I'll take address " + addr.toString());
System.out.println("Associated hostname: " + addr.getHostName());
localAddr = addr;
break;
}
}
if( localAddr != null ) break;
}
} catch( NoSuchElementException e) {
System.out.println("Couldn't find a public address");
localAddr = null;
} catch (SocketException e) {
e.printStackTrace();
localAddr = null;
}
return localAddr;
}
答案 3 :(得分:0)
其他解决方案可以使用套接字(不是最好的套接字)
Socket socket = new Socket("www.somesite.com", 80);
InetAddress localhost = socket.getLocalAddress();
System.out.println("Address of local host is " + localhost);
socket.close();