关于JAVA取本机ip的一些传说
先看一段代码:the IP address of the local host. 在大多数机器上都可以取到本机ip
InetAddress.getLocalHost().getHostAddress()
但是多网卡配置的时候,就悲剧了:下图这个机器使用上面的命令取回的是127.0.0.1。
用ifconfig看网卡:
这个时候就需要枚举多网卡判断了
Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
然后结合IP4的地址段做区分,主要利用以下两个方法:
ip.isSiteLocalAddress() && !ip.isLoopbackAddress()
最终方法如下(从网上copy来的..)
/**
* 多IP处理,可以得到最终ip
* @return
*/
public static String getIp() {
String localip = null;// 本地IP,如果没有配置外网IP则返回它
String netip = null;// 外网IP
try {
Enumeration<NetworkInterface> netInterfaces = NetworkInterface
.getNetworkInterfaces();
InetAddress ip = null;
boolean finded = false;// 是否找到外网IP
while (netInterfaces.hasMoreElements() && !finded) {
NetworkInterface ni = netInterfaces.nextElement();
Enumeration<InetAddress> address = ni.getInetAddresses();
while (address.hasMoreElements()) {
ip = address.nextElement();
// System.out.println(ni.getName() + ";" + ip.getHostAddress()
// + ";ip.isSiteLocalAddress()="
// + ip.isSiteLocalAddress()
// + ";ip.isLoopbackAddress()="
// + ip.isLoopbackAddress());
if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress()
&& ip.getHostAddress().indexOf(":") == -1) {// 外网IP
netip = ip.getHostAddress();
finded = true;
break;
} else if (ip.isSiteLocalAddress()
&& !ip.isLoopbackAddress()
&& ip.getHostAddress().indexOf(":") == -1) {// 内网IP
localip = ip.getHostAddress();
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
if (netip != null && !"".equals(netip)) {
return netip;
} else {
return localip;
}
}