content: package com.ctrip.framework.foundation.internals;
  
  import java.net.Inet4Address;
  import java.net.InetAddress;
  import java.net.NetworkInterface;
  import java.net.SocketException;
  import java.net.UnknownHostException;
  import java.util.ArrayList;
  import java.util.Collections;
  import java.util.Enumeration;
  import java.util.List;
  import java.util.Objects;
  
  public enum NetworkInterfaceManager {
    INSTANCE;
  
    private InetAddress m_local;
  
    private InetAddress m_localHost;
  
    private NetworkInterfaceManager() {
      load();
    }
  
    public InetAddress findValidateIp(List<InetAddress> addresses) {
      InetAddress local = null;
      int maxWeight = -1;
      for (InetAddress address : addresses) {
        if (address instanceof Inet4Address) {
          int weight = 0;
  
          if (address.isSiteLocalAddress()) {
            weight += 8;
          }
  
          if (address.isLinkLocalAddress()) {
            weight += 4;
          }
  
          if (address.isLoopbackAddress()) {
            weight += 2;
          }
  
          // has host name
          // TODO fix performance issue when calling getHostName
          if (!Objects.equals(address.getHostName(), address.getHostAddress())) {
            weight += 1;
          }
  
          if (weight > maxWeight) {
            maxWeight = weight;
            local = address;
          }
        }
      }
      return local;
    }
  
    public String getLocalHostAddress() {
      return m_local.getHostAddress();
    }
  
    public String getLocalHostName() {
      try {
        if (null == m_localHost) {
          m_localHost = InetAddress.getLocalHost();
        }
        return m_localHost.getHostName();
      } catch (UnknownHostException e) {
        return m_local.getHostName();
      }
    }
  
    private String getProperty(String name) {
      String value = null;
  
      value = System.getProperty(name);
  
      if (value == null) {
        value = System.getenv(name);
      }
  
      return value;
    }
  
    private void load() {
      String ip = getProperty("host.ip");
  
      if (ip != null) {
        try {
          m_local = InetAddress.getByName(ip);
          return;
        } catch (Exception e) {
          System.err.println(e);
          // ignore
        }
      }
  
      try {
        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
        List<NetworkInterface> nis = interfaces == null ? Collections.<NetworkInterface>emptyList() : Collections.list(interfaces);
        List<InetAddress> addresses = new ArrayList<InetAddress>();
        InetAddress local = null;
  
        try {
          for (NetworkInterface ni : nis) {
            if (ni.isUp() && !ni.isLoopback()) {
              addresses.addAll(Collections.list(ni.getInetAddresses()));
            }
          }
          local = findValidateIp(addresses);
        } catch (Exception e) {
          // ignore
        }
        if (local != null) {
          m_local = local;
          return;
        }
      } catch (SocketException e) {
        // ignore it
      }
  
      m_local = InetAddress.getLoopbackAddress();
    }
  }
  