免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8845 | 回复: 2
打印 上一主题 下一主题

获取本机外网IP地址 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-24 09:17 |只看该作者 |倒序浏览
通过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. }
复制代码

论坛徽章:
9
2015年亚洲杯之中国
日期:2015-03-30 15:47:152015亚冠之布里斯班狮吼
日期:2015-09-24 09:24:52技术图书徽章
日期:2015-12-04 19:47:59数据库技术版块每日发帖之星
日期:2015-12-13 06:20:00CU十四周年纪念徽章
日期:2016-06-15 11:23:562017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之四川
日期:2020-01-02 09:33:04CU十四周年纪念徽章
日期:2020-01-14 21:07:5615-16赛季CBA联赛之江苏
日期:2020-04-28 13:59:15
2 [报告]
发表于 2015-08-04 20:30 |只看该作者
写的不错,学习了

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
3 [报告]
发表于 2015-08-12 10:48 |只看该作者
每种语言都大同小异,和C#差不多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP