我开始深入研究如何通过Java获取IP地址。我知道一台机器可以通过不同的网络接口拥有不同的IP,所以我对我发现的一些似乎返回“首选”IP地址的示例代码感到有点困惑(根据Windows7命令行ipconfig /all,首选)。
当我在本地计算机上运行以下代码时,返回了26个NetworkInterface对象,其中一些具有多个InetAddress对象(包括“首选”对象):
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();
}我似乎找不到将其标识为“首选”的NetworkInterface (以及其中的InetAddress )属性/方法,所以我想知道类方法InetAddress.getLocalHost()是如何做到的?此外,这个首选IP是标准的网络概念还是某种类型的Windows特定概念?
谢谢。
发布于 2013-02-12 01:34:20
我认为“首选”可能在某种程度上是指路由表中最通用的条目。谁知道那些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;
}https://stackoverflow.com/questions/14817483
复制相似问题