服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java如何根据IP获取当前区域天气信息详解

java如何根据IP获取当前区域天气信息详解

2021-11-04 10:18Kiss Java教程

根据IP自动获取当地的天气预报信息这个功能大家应该都遇到过,天气预报信息用途非常广泛,篇文章主要给大家介绍了关于java如何根据IP获取当前区域天气信息的相关资料,需要的朋友可以参考下

大致思路是客户端发起请求,我们首先根据请求获取到外网IP,然后再根据外网IP获取到用户所在城市,最后根据城市获取到天气信息

获取外网IP

万网获取外网IP地址:www.net.cn/static/cust

java" id="highlighter_570813">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
 * @Description:获取客户端外网ip 此方法要接入互联网才行,内网不行
 **/
public static String getPublicIp() {
    try {
        String path = "http://www.net.cn/static/customercare/yourip.asp";// 要获得html页面内容的地址(万网)
 
        URL url = new URL(path);// 创建url对象
 
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 打开连接
 
        conn.setRequestProperty("contentType", "GBK"); // 设置url中文参数编码
 
        conn.setConnectTimeout(5 * 1000);// 请求的时间
 
        conn.setRequestMethod("GET");// 请求方式
 
        InputStream inStream = conn.getInputStream();
        // readLesoSysXML(inStream);
 
        BufferedReader in = new BufferedReader(new InputStreamReader(
                inStream, "GBK"));
        StringBuilder buffer = new StringBuilder();
        String line;
        // 读取获取到内容的最后一行,写入
        while ((line = in.readLine()) != null) {
            buffer.append(line);
        }
        List<String> ips = new ArrayList<>();
 
        //用正则表达式提取String字符串中的IP地址
        String regEx="((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)";
        String str = buffer.toString();
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        while (m.find()) {
            String result = m.group();
            ips.add(result);
        }
 
        // 返回公网IP值
        return ips.get(0);
 
    } catch (Exception e) {
        System.out.println("获取公网IP连接超时");
        return "";
    }
}

根据外网IP获取用户所在城市

首先你待需要一个ip2region.db文件,大家可以百度一下,我在这里整理了一份放在网盘上了,有需要的可以下载一下

下载地址:点击这里

ip2region准确率99.9%的ip地址定位库,0.0x毫秒级查询,数据库文件大小只有1.5M,提供了java,php,c,python,nodejs,golang查询绑定和Binary,B树,内存三种查询算法

引入ip2region.db

java如何根据IP获取当前区域天气信息详解

maven依赖

?
1
2
3
4
5
6
<!--ip2region-->
<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>1.7.2</version>
</dependency>

创建IPUtils工具类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@Log4j2
public class IPUtils {
 
    /**
     * 根据IP获取地址
     *
     * @return 国家|区域|省份|城市|ISP
     */
    public static String getAddress(String ip) {
        return getAddress(ip, DbSearcher.BTREE_ALGORITHM);
    }
 
    /**
     * 根据IP获取地址
     *
     * @param ip
     * @param algorithm 查询算法
     * @return 国家|区域|省份|城市|ISP
     * @see DbSearcher
     * DbSearcher.BTREE_ALGORITHM; //B-tree
     * DbSearcher.BINARY_ALGORITHM //Binary
     * DbSearcher.MEMORY_ALGORITYM //Memory
     */
    @SneakyThrows
    public static String getAddress(String ip, int algorithm) {
        if (!Util.isIpAddress(ip)) {
            log.error("错误格式的ip地址: {}", ip);
            return "";
        }
        String dbPath = IPUtils.class.getResource("/db/ip2region.db").getPath();
        File file = new File(dbPath);
        if (!file.exists()) {
            log.error("地址库文件不存在");
            return "";
        }
        DbSearcher searcher = new DbSearcher(new DbConfig(), dbPath);
        DataBlock dataBlock;
        switch (algorithm) {
            case DbSearcher.BTREE_ALGORITHM:
                dataBlock = searcher.btreeSearch(ip);
                break;
            case DbSearcher.BINARY_ALGORITHM:
                dataBlock = searcher.binarySearch(ip);
                break;
            case DbSearcher.MEMORY_ALGORITYM:
                dataBlock = searcher.memorySearch(ip);
                break;
            default:
                log.error("未传入正确的查询算法");
                return "";
        }
        searcher.close();
        return dataBlock.getRegion();
    }

根据城市获取天气信息

第三方天气接口:portalweather.comsys.net.cn/weather03/a

调用第三方天气接口获取天气信息,本文使用java自带工具类HttpUtils

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@GetMapping("/weather")
@DecryptBody(encode = true) //响应加密
public Result getWeather(){
    String publicIp = GetIPUtils.getPublicIp();//获取外网IP
    if (StringUtils.isBlank(publicIp)) return ResultUtils.error("获取失败");
    String cityInfo = IPUtils.getAddress(publicIp);//国家|区域|省份|城市|ISP
    if (StringUtils.isBlank(cityInfo)) return ResultUtils.error("获取失败");
    String[] split = cityInfo.split("\|");
    String city = "";
    for (String aSplit : split) if (aSplit.contains("市")) city = aSplit;//拿取市级名称
    if (StringUtils.isBlank(city)) return ResultUtils.error("获取失败");
    String weatherInformation = HttpUtil.get("http://portalweather.comsys.net.cn/weather03/api/weatherService/getDailyWeather?cityName=" + city);//调用天气接口
    if (StringUtils.isBlank(weatherInformation)) return ResultUtils.error("获取失败");
    Object o = ObjectMapperUtils.strToObj(weatherInformation,Object.class);
    return ResultUtils.success("获取成功",o);
}

总结

到此这篇关于java如何根据IP获取当前区域天气信息的文章就介绍到这了,更多相关java获取当前区域天气信息内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/6990248455012614175

延伸 · 阅读

精彩推荐
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12