java 获取本地机器外网的IP地址

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

ServerHost.java
  1. package org.shuochen.test.network;

  2. import java.net.InetAddress;
  3. import java.net.NetworkInterface;
  4. import java.net.SocketException;
  5. import java.util.Enumeration;
  6. /**
  7. * Helper class the get the external net IP address
  8. */
  9. public class ServerHost {
  10.     /**
  11.      * Singleton instance
  12.      */
  13.     private static final ServerHost instance = new ServerHost();
  14.     /**
  15.      * Access Control
  16.      */
  17.     private ServerHost(){};
  18.     /**
  19.      * @return instance
  20.      */
  21.     public static ServerHost getInstance() {
  22.         return instance;
  23.     }
  24.      
  25.     public String getExtranetIPv4Address(){
  26.         return searchNetworkInterfaces(IPAcceptFilterFactory.getIPv4AcceptFilter());
  27.     }
  28.      
  29.      
  30.     public String getExtranetIPv6Address(){
  31.         return searchNetworkInterfaces(IPAcceptFilterFactory.getIPv6AcceptFilter());
  32.     }
  33.      
  34.      
  35.     public String getExtranetIPAddress(){
  36.         return searchNetworkInterfaces(IPAcceptFilterFactory.getIPAllAcceptFilter());
  37.     }
  38.      
  39.     private String searchNetworkInterfaces(IPAcceptFilter ipFilter){
  40.         try {
  41.             Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();
  42.             while (enumeration.hasMoreElements()) {
  43.                 NetworkInterface networkInterface = enumeration.nextElement();
  44.                 //Ignore Loop/virtual/Non-started network interface
  45.                 if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()) {
  46.                     continue;
  47.                 }
  48.                 Enumeration<InetAddress> addressEnumeration = networkInterface.getInetAddresses();
  49.                 while (addressEnumeration.hasMoreElements()) {
  50.                     InetAddress inetAddress = addressEnumeration.nextElement();
  51.                     String address = inetAddress.getHostAddress();
  52.                     if(ipFilter.accept(address)){
  53.                         return address;
  54.                     }
  55.                 }
  56.             }
  57.         } catch (SocketException e) {
  58.             //consider log for this exception
  59.         }
  60.         return "";
  61.     }

  62. }
复制代码
IPAcceptFilterFactory.java
  1. package org.shuochen.test.network;

  2. public class IPAcceptFilterFactory {
  3.     public static IPAcceptFilter getIPAllAcceptFilter(){
  4.         return IPAllAcceptFilter.getInstance();
  5.     }
  6.     public static IPAcceptFilter getIPv4AcceptFilter(){
  7.         return IPv4AcceptFilter.getInstance();
  8.     }
  9.     public static IPAcceptFilter getIPv6AcceptFilter(){
  10.         return IPv6AcceptFilter.getInstance();
  11.     }

  12. }
复制代码
IPAcceptFilter.java
  1. package org.shuochen.test.network;

  2. /**
  3. * Consider @FunctionalInterface for JDK8
  4. *
  5. */
  6. public interface IPAcceptFilter {
  7.     public String IPv6KeyWord = ":";
  8.     public boolean accept(String ipAddress);
  9. }
复制代码
IPAllAcceptFilter.java
  1. package org.shuochen.test.network;

  2. public class IPAllAcceptFilter implements IPAcceptFilter{
  3.     private static IPAcceptFilter instance = null;
  4.      
  5.     /**
  6.      * Access Control
  7.      */
  8.     private IPAllAcceptFilter(){};
  9.      
  10.     /**
  11.      * Ignore multiple thread sync problem in extreme case
  12.      */
  13.     public static IPAcceptFilter getInstance(){
  14.         if(instance == null){
  15.             instance = new IPAllAcceptFilter();
  16.         }
  17.         return instance;
  18.     }

  19.     @Override
  20.     public boolean accept(String ipAddress) {
  21.         return true;
  22.     }


  23. }
复制代码
IPv4AcceptFilter.java
  1. package org.shuochen.test.network;

  2. public class IPv4AcceptFilter implements IPAcceptFilter{
  3.     private static IPAcceptFilter instance = null;
  4.      
  5.     /**
  6.      * Access Control
  7.      */
  8.     private IPv4AcceptFilter(){};
  9.      
  10.     /**
  11.      * Ignore multiple thread sync problem in extreme case
  12.      */
  13.     public static IPAcceptFilter getInstance(){
  14.         if(instance == null){
  15.             instance = new IPv4AcceptFilter();
  16.         }
  17.         return instance;
  18.     }

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


  23. }
复制代码
IPv6AcceptFilter.java
  1. package org.shuochen.test.network;

  2. public class IPv6AcceptFilter implements IPAcceptFilter{
  3.     private static IPAcceptFilter instance = null;
  4.      
  5.     /**
  6.      * Access Control
  7.      */
  8.     private IPv6AcceptFilter(){};
  9.      
  10.     /**
  11.      * Ignore multiple thread sync problem in extreme case
  12.      */
  13.     public static IPAcceptFilter getInstance(){
  14.         if(instance == null){
  15.             instance = new IPv6AcceptFilter();
  16.         }
  17.         return instance;
  18.     }

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


  23. }
复制代码
Test.java
  1. package org.shuochen.test.network;

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

  8. }
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值