原理

通过 HTTP 访问第三方获取 IP 的服务接口获取本机的外网 IP,例如:

  • http://checkip.amazonaws.com/
  • https://ipv4.icanhazip.com/
  • http://bot.whatismyipaddress.com/
  • 等等…

考虑到这些第三方接口不一定 100% 稳定,例如可能出现下线、错误、访问超时或太慢的情况,所以不能仅依赖其中之一。

下面提供一种方案,并发访问这些服务接口,并返回第一个成功的结果,也就是其中最快的一个返回结果。

实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.regex.Pattern;public class ExternalIPUtil {/*** IP 地址校验的正则表达式*/private static final Pattern IPV4_PATTERN = Pattern.compile("^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");/*** 获取 IP 地址的服务列表*/private static final String[] IPV4_SERVICES = {"http://checkip.amazonaws.com/","https://ipv4.icanhazip.com/","http://bot.whatismyipaddress.com/"// and so on ...};public static String get() throws ExecutionException, InterruptedException {List<Callable<String>> callables = new ArrayList<>();for (String ipService : IPV4_SERVICES) {callables.add(() -> get(ipService));}ExecutorService executorService = Executors.newCachedThreadPool();try {// 返回第一个成功获取的 IPreturn executorService.invokeAny(callables);} finally {executorService.shutdown();}}private static String get(String url) throws IOException {try (BufferedReader in = new BufferedReader(new InputStreamReader(new URL(url).openStream()))) {String ip = in.readLine();if (IPV4_PATTERN.matcher(ip).matches()) {return ip;} else {throw new IOException("invalid IPv4 address: " + ip);}}}
}

线程池的 ExecutorService.invokeAny(callables) 方法用于并发执行多个线程,并拿到最快的执行成功的线程的返回值,只要有一个执行成功,其他失败的任务都会忽略。但是如果全部失败,例如本机根本就没有连外网,那么就会抛出 ExecutionException 异常。

Gist

https://gist.github.com/wucao/811e0bbe08f2dfab527a065d052d12a5

关注我

Java 获取本机的外网 IP相关推荐

  1. java获取本机的外网ip----最简便、易懂

    IP/IPv6查询,服务器地址查询 - 站长工具 可以通过上面的网站进行手动查询本机的外网ip java代码 public class IPUntils {public static String g ...

  2. 如何查看本机的外网IP地址

    如何查看本机的外网IP地址 在百度中输入IP

  3. PHP 显示本机的外网IP

    由于公司的外网IP经常的变化,有时需要知道自己的外网IP,所以写了下面的小东西 <? while(true) {     $ch = curl_init('http://www.ip138.co ...

  4. js获取本机的外网/广域网ip地址

    完整源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  5. 如何查看本机的外网IP

    windows和Linux系统查看本机外网IP的方法是不同的. windows比较简单,直接百度"本机IP"即可 如果是linux系统,输入命令telnet cip.cc,如下图所 ...

  6. 要获取NAT之后的外网IP地址

    windows下IP138.com Linux下: 确保能访问互联网,DNS解析正常的情况下执行 ifconfig.me是一个和ip138类似的神奇的网站~~~ $ curl ifconfig.me ...

  7. Java获取(外网)网络IP和本机真实IP Java获取真实IP Java获取真实ip Java获取本机ip Java获取 本机真实ip

    /*** IP地址相关工具类*/ public class IpUtil {private static final Logger logger = LoggerFactory.getLogger(I ...

  8. java如何获得内网ip、外网ip、以及如何根据ip查询地址

    今天突发奇想地想要用java写一个小的工具类. 用来实现如何获得本机的内网ip,外网ip和根据ip获得相应的地址. 花了几个小时才弄清,然后整理了一下,希望有用. 首先要明白以下三种ip地址的区别: ...

  9. 获取外网IP并发送邮件通知

    名称: IP地址通知器 下载最新版  (在使用的过程中,如果您有什么问题,请给我发邮件,或者在这里(csdn我的博客)上留言.) 版本: 1.26 正式版 作者: 阙荣文 - Que's C++ St ...

最新文章

  1. NYOJ 1053 Alice and Bob (N)
  2. 基于实时计算Flink版的场景解决方案demo
  3. Android MuPDF 阅读PDF文件
  4. AS3组件之Slider滑块拖动条
  5. 阿里巴巴Java开发文档2020版学习-常量定义
  6. c#绝对值函数图像_取绝对值(C#、C++、js)
  7. 计算机时区找不到北京,emwin7时区/em 怎么没有北京时间了-win7时区,win7系统怎么添加北京时区...
  8. 人人商城图片错乱问题
  9. 51单片机控制的自动感应调光、坐姿矫正智能台灯
  10. 从零搭建游戏服务器,拢共分几步?
  11. ios xcode 给ipa包签名
  12. python工具类-sql操作封装
  13. Ubuntu快捷键 终端快捷键
  14. SpringBoot(一):什么是SpringBoot?
  15. ubuntu18连不上安卓手机的USB网络共享
  16. 又一位零基础成功转行上岸的 Python 大佬
  17. python爬虫入门篇(二)
  18. 这就是搜索引擎——检索模型与搜索结果排序
  19. 用java求一百以内的素数
  20. Linux常用基本命令Android系统编译命令

热门文章

  1. 【详细】linux系统安装显卡驱动(Nvidia driver) + cuda10.2
  2. 汉得笔试题oracle,【汉得java开发笔试回忆总结】
  3. 苏州大学计算机专业课872考研真题1999~2020含答案解析 网盘分享
  4. 软件测试-5-图编辑引擎antVx6和交互原型设计软件Axure
  5. 会议准备Meeting Preparation
  6. 微信公众平台深度开发JAVA版第一季 10.接收普通消息3
  7. mysql is null优化_如何优化mysql的is null?
  8. canvas 绘制刮刮卡
  9. 车灯线光源的优化设计matlab,基于Matlab的车灯线光源优化设计的实施方案海南大学.PDF...
  10. ear包目录_EAR文件结构