当前位置: 首页 > 后端技术 > Java

Java获取机器外网IP原理

时间:2023-04-01 22:18:46 Java

访问第三方获取IP的服务接口,通过HTTP获取机器外网IP,例如:http://checkip.amazonaws.com/https://ipv4.icanhazip。com/http://bot.whatismyipaddress.com/等...考虑到这些第三方接口不一定100%稳定,比如可能会出现离线、错误、访问超时或者太慢等情况,所以你可以'只是依靠他们一个。下面提供并发访问这些服务接口并返回第一个成功结果的方案,这是其中最快的。实施导入java.io.BufferedReader;导入java.io.IOException;导入java.io.InputStreamReader;导入java.net.URL;导入java.util.ArrayList;导入java.util.List;导入java.util.concurrent。*;importjava.util.regex.Pattern;publicclassExternalIPUtil{/***IP地址验证正则表达式*/privatestaticfinalPatternIPV4_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地址的服务列表*/privatestaticfinalString[]IPV4_SERVICES={"http://checkip.amazonaws.com/","https://ipv4.icanhazip.com/","http://bot.whatismyipaddress.com/"//等等...};publicstaticStringget()throwsExecutionException,InterruptedException{List>callables=newArrayList<>();for(StringipService:IPV4_SERVICES){callables.add(()->get(ipService));}执行orServiceexecutorService=Executors.newCachedThreadPool();try{//返回第一个成功获取的IPreturnexecutorService.invokeAny(callables);}最后{executorService.shutdown();}}privatestaticStringget(Stringurl)throwsIOException{try(BufferedReaderin=newBufferedReader(newInputStreamReader(newURL(url).openStream()))){Stringip=in.readLine();如果(IPV4_PATTERN.matcher(ip).matches()){返回ip;}else{thrownewIOException("无效的IPv4地址:"+ip);}}}}线程池的ExecutorService.invokeAny(callables)方法用于并发执行多个线程,获取最快的成功线程,只要其中一个任务执行成功,其他失败的任务将被忽略。但是如果都失败了,比如机器根本没有连接外网,那么就会抛出ExecutionException。关注我的公众号