小编闲着没事,偶然发现,当前各个平台,像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地址查询
小编已测过,真实有效哦,快去试试吧!