- pfmiles ```java import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import java.util.HashSet; import java.util.Iterator; import java.util.Set;
/**
- 获取本地ip的工具
- @author pf-miles
@since 2014-11-25 */ public class LocalIpAddressUtil {
/**
获取本地ip地址,有可能会有多个地址, 若有多个网卡则会搜集多个网卡的ip地址 */ public static Set
resolveLocalAddresses() { Set addrs = new HashSet (); Enumeration ns = null; try { ns = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
// ignored...
} while (ns != null && ns.hasMoreElements()) {
NetworkInterface n = ns.nextElement(); Enumeration<InetAddress> is = n.getInetAddresses(); while (is.hasMoreElements()) { InetAddress i = is.nextElement(); if (!i.isLoopbackAddress() && !i.isLinkLocalAddress() && !i.isMulticastAddress() && !isSpecialIp(i.getHostAddress())) addrs.add(i); }
} return addrs; }
public static Set
resolveLocalIps() { Set addrs = resolveLocalAddresses(); Set ret = new HashSet (); for (InetAddress addr : addrs) ret.add(addr.getHostAddress());
return ret; }
/**
取得当前机器的address信息,若有多个则随机选一个 */ public static InetAddress resolveLocalAddress() { Set
addrs = resolveLocalAddresses(); if (addrs != null && !addrs.isEmpty()) return addrs.iterator().next(); return null; } private static boolean isSpecialIp(String ip) { if (ip.contains(“:”)) return true; if (ip.startsWith(“127.”)) return true; if (ip.startsWith(“169.254.”)) return true; if (ip.equals(“255.255.255.255”)) return true; return false; }
}
2. dubbo中的方式
```java
private static InetAddress getLocalAddress0() {
InetAddress localAddress = null;
// 首先尝试获取 /etc/hosts 中 hostname 对应的 IP
localAddress = InetAddress.getLocalHost();
Optional<InetAddress> addressOp = toValidAddress(localAddress);
if (addressOp.isPresent()) {
return addressOp.get();
}
// 没有找到适合注册的 IP,则开始轮询网卡
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
if (null == interfaces) {
return localAddress;
}
while (interfaces.hasMoreElements()) {
NetworkInterface network = interfaces.nextElement();
if (network.isLoopback() || network.isVirtual() || !network.isUp()) {
continue;
}
Enumeration<InetAddress> addresses = network.getInetAddresses();
while (addresses.hasMoreElements()) {
// 返回第一个匹配的适合注册的 IP
Optional<InetAddress> addressOp = toValidAddress(addresses.nextElement());
if (addressOp.isPresent()) {
return addressOp.get();
}
}
}
return localAddress;
}
private static Optional<InetAddress> toValidAddress(InetAddress address) {
if (address instanceof Inet6Address) {
Inet6Address v6Address = (Inet6Address) address;
if (isValidV6Address(v6Address)) {
return Optional.ofNullable(normalizeV6Address(v6Address));
}
}
if (isValidV4Address(address)) {
return Optional.of(address);
}
return Optional.empty();
}
static boolean isValidV6Address(Inet6Address address) {
boolean preferIpv6 = Boolean.getBoolean("java.net.preferIPv6Addresses");
if (!preferIpv6) {
return false;
}
try {
return address.isReachable(100);
} catch (IOException e) {
// ignore
}
return false;
}
static boolean isValidV4Address(InetAddress address) {
if (address == null || address.isLoopbackAddress()) {
return false;
}
String name = address.getHostAddress();
boolean result = (name != null
&& IP_PATTERN.matcher(name).matches()
&& !Constants.ANYHOST_VALUE.equals(name)
&& !Constants.LOCALHOST_VALUE.equals(name));
return result;
}