chinarocky 发表于 2015-06-24 09:17

获取本机外网IP地址

通过Java获取本地机器外网的IP地址,不借助系统命令

ServerHost.javapackage org.shuochen.test.network;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
/**
* Helper class the get the external net IP address
*/
public class ServerHost {
    /**
   * Singleton instance
   */
    private static final ServerHost instance = new ServerHost();
    /**
   * Access Control
   */
    private ServerHost(){};
    /**
   * @return instance
   */
    public static ServerHost getInstance() {
      return instance;
    }
   
    public String getExtranetIPv4Address(){
      return searchNetworkInterfaces(IPAcceptFilterFactory.getIPv4AcceptFilter());
    }
   
   
    public String getExtranetIPv6Address(){
      return searchNetworkInterfaces(IPAcceptFilterFactory.getIPv6AcceptFilter());
    }
   
   
    public String getExtranetIPAddress(){
      return searchNetworkInterfaces(IPAcceptFilterFactory.getIPAllAcceptFilter());
    }
   
    private String searchNetworkInterfaces(IPAcceptFilter ipFilter){
      try {
            Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();
            while (enumeration.hasMoreElements()) {
                NetworkInterface networkInterface = enumeration.nextElement();
                //Ignore Loop/virtual/Non-started network interface
                if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()) {
                  continue;
                }
                Enumeration<InetAddress> addressEnumeration = networkInterface.getInetAddresses();
                while (addressEnumeration.hasMoreElements()) {
                  InetAddress inetAddress = addressEnumeration.nextElement();
                  String address = inetAddress.getHostAddress();
                  if(ipFilter.accept(address)){
                        return address;
                  }
                }
            }
      } catch (SocketException e) {
            //consider log for this exception
      }
      return "";
    }

}IPAcceptFilterFactory.javapackage org.shuochen.test.network;

public class IPAcceptFilterFactory {
    public static IPAcceptFilter getIPAllAcceptFilter(){
      return IPAllAcceptFilter.getInstance();
    }
    public static IPAcceptFilter getIPv4AcceptFilter(){
      return IPv4AcceptFilter.getInstance();
    }
    public static IPAcceptFilter getIPv6AcceptFilter(){
      return IPv6AcceptFilter.getInstance();
    }

}IPAcceptFilter.javapackage org.shuochen.test.network;

/**
* Consider @FunctionalInterface for JDK8
*
*/
public interface IPAcceptFilter {
    public String IPv6KeyWord = ":";
    public boolean accept(String ipAddress);
}IPAllAcceptFilter.javapackage org.shuochen.test.network;

public class IPAllAcceptFilter implements IPAcceptFilter{
    private static IPAcceptFilter instance = null;
   
    /**
   * Access Control
   */
    private IPAllAcceptFilter(){};
   
    /**
   * Ignore multiple thread sync problem in extreme case
   */
    public static IPAcceptFilter getInstance(){
      if(instance == null){
            instance = new IPAllAcceptFilter();
      }
      return instance;
    }

    @Override
    public boolean accept(String ipAddress) {
      return true;
    }


}IPv4AcceptFilter.javapackage org.shuochen.test.network;

public class IPv4AcceptFilter implements IPAcceptFilter{
    private static IPAcceptFilter instance = null;
   
    /**
   * Access Control
   */
    private IPv4AcceptFilter(){};
   
    /**
   * Ignore multiple thread sync problem in extreme case
   */
    public static IPAcceptFilter getInstance(){
      if(instance == null){
            instance = new IPv4AcceptFilter();
      }
      return instance;
    }

    @Override
    public boolean accept(String ipAddress) {
      return ipAddress != null && ipAddress.indexOf(IPv6KeyWord) == -1;
    }


}IPv6AcceptFilter.javapackage org.shuochen.test.network;

public class IPv6AcceptFilter implements IPAcceptFilter{
    private static IPAcceptFilter instance = null;
   
    /**
   * Access Control
   */
    private IPv6AcceptFilter(){};
   
    /**
   * Ignore multiple thread sync problem in extreme case
   */
    public static IPAcceptFilter getInstance(){
      if(instance == null){
            instance = new IPv6AcceptFilter();
      }
      return instance;
    }

    @Override
    public boolean accept(String ipAddress) {
      return ipAddress != null && ipAddress.indexOf(IPv6KeyWord) > -1;
    }


}Test.javapackage org.shuochen.test.network;

public class Test {
    public static void main(String[] args) {
      System.out.println(ServerHost.getInstance().getExtranetIPAddress());
      System.out.println(ServerHost.getInstance().getExtranetIPv4Address());
      System.out.println(ServerHost.getInstance().getExtranetIPv6Address());
    }

}

yanglixing 发表于 2015-08-04 20:30

写的不错,学习了

renxiao2003 发表于 2015-08-12 10:48

每种语言都大同小异,和C#差不多。
页: [1]
查看完整版本: 获取本机外网IP地址