1. 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 {

        1. 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;
    }