Java公网(外网)IP获取详细的地域信息_最后有个小彩蛋

 

小编闲着没事,偶然发现,当前各个平台,像B站,某乎等,而小编记得Java一般也可以实现这样的功能,而网络上主要介绍的有两种方式。

1.通过网络公告API来发起请求来获取区域信息,比较多的是淘宝api以及新浪api,但听说这两个API经常会出毛病,而小编也根据网络资源试过了,不知是不是小编自身的原因,总之,并没有成功发起请求,或者并没有成功取到地址信息,所以就真实业务中,这两个api是不可行的,小编在搜集网络资源时,也发现了一个第三方的IP区域信息获取平台,但一般需要付费,所以小编没有试过,有硬性业务要求的小伙伴可以试试,这里将链接贴上:纯真-中国IP地理位置数据库首创者

通过API的方式来获取:速度快,响应及时,能够快速的取到需要的区域信息,缺点:需要依赖于网络,甚至一旦请求的目标地址崩坏了,也就取不到了,这就是很崩溃的事情。

2.通过离线IP地址库来获取,网络上介绍的比较多的,主要是通过ip2region.db和ip2region.xdb两种离线库,其实这是相对于API请求的另一种独立的方案,他的有点就是比较稳定,不会受网络影响,缺点:因为是离线地址库,当国际地址信息变更时,所获取的信息可能会不准确。但上面这两个地址库小编也亲自根据网络资源试过了,也没有奏效,就是报错了,哈哈,但小编依然没有放弃继续寻觅,终于发现了一个好用的库,这个库不止可以获取基本的区域信息,会连同经纬度一起取到,以及国际标准编码,行政单位编号等。好了,基本介绍就到这里了,下面开始上代码,这是小编亲测真实有效的。

a.下载离线IP地址库文件:

【官网地址】:https://dev.maxmind.com/geoip/updating-databases?lang=en

下滑到最底部,点击这个update...

 

下滑到这个位置:

 因为去到下载页面需要登录,小编也没有账号,也懒得注册,有兴趣的小伙伴可以试试,而小编使用了其他的下载链接,

【其他下载】:http://xiazai.jb51.net/201710/yuanma/GeoLite2-City_20171003(jb51.net).rar

下载的文件为:

解压之后:

 b.导入依赖:

        <dependency>
            <groupId>com.maxmind.geoip2</groupId>
            <artifactId>geoip2</artifactId>
            <version>2.8.1</version>
        </dependency>

 c.主代码

public static Map<String,String> getAreabyIP(String path,String ip) throws IOException, GeoIp2Exception {
		// 创建 GeoLite2 数据库
		File database = new File(path);
		// 读取数据库内容
		DatabaseReader reader = new DatabaseReader.Builder(database).build();
		InetAddress ipAddress = InetAddress.getByName(ip);
		Map<String,String> result=new HashMap<>();
		// 获取查询结果
		CityResponse response = reader.city(ipAddress);

		// 获取国家信息
		Country country = response.getCountry();
		// 获取省份
		Subdivision subdivision = response.getMostSpecificSubdivision();
		// 获取城市
		City city = response.getCity();
		//位置信息
		Location location = response.getLocation();
		String standcode=country.getIsoCode();//标准编码 中国CN 日本JP
		String english_info="";String chinese_info="";
		String longitude="";String latitude="";
		english_info=english_info+country.getName()+" "+(Is_Null(subdivision.getName())==true?"":subdivision.getName())+" "+city.getName();
		chinese_info=chinese_info+country.getNames().get("zh-CN")+(Is_Null(subdivision.getNames().get("zh-CN"))==true?"":subdivision.getNames().get("zh-CN"))+city.getNames().get("zh-CN");
		String provinceno=subdivision.getIsoCode();//省份编号
		longitude=location.getLongitude()+"";
		latitude=location.getLatitude()+"";
		result.put("standcode",standcode);//标准编码 中国CN 日本JP
		result.put("provinceno",provinceno);//省份编号
		result.put("english_info",english_info);//英文地址信息
		result.put("chinese_info",chinese_info);//中文地址信息
		result.put("longitude",longitude);//经度
		result.put("latitude",latitude);//纬度
		return result;
}

 d.测试

 

完美取到区域信息。以上就是小编根据网络资源整理的Java实现根据IP地址获取区域信息的过程。

以上如有不足之处,请评论留言,欢迎关注点赞转发。

最后给大家贴个彩蛋,Java实现域名解析为ip地址:java将域名解析为IP地址_51CTO博客_8x8x域名解析函数ip地址查询

 小编已测过,真实有效哦,快去试试吧!

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾疾唯君医

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值