ip2region——准确率 99.9% 的 ip 地址定位库,0.0x 毫秒级查询,数据库文件大小只有 1.5M,提供了 java、php、c、python、node.js、golang 查询绑定和 Binary、B 树、内存三种查询算法。
1. 99.9%准确率,定时更新:
数据聚合了一些知名 ip 到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比纯真啥的准确多了。
每次聚合一下数据需要 1-2 天,会不定时更新。
2. 标准化的数据格式:
每条 ip 数据段都固定了格式:城市Id|国家|区域|省份|城市|ISP
只有中国的数据精确到了城市,其他国家只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家。
(请忽略前面的城市 Id,个人项目需求)
3. 体积小:
生成的数据库文件 ip2region.db 只有 1.5M (1.2 版本前 3.5M)
4. 多查询客户端的支持,0.0x 毫秒级别的查询
已经集成的客户端有:java, php, c,python,php扩展,nodejs,golang。
<!-- ip定位地址 --> <dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>1.7</version> </dependency>
下载地址
ip2region: 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,数据库文件大小只有1.5M,提供了java,php,c,python,nodejs,golang,c#等查询绑定和Binary,B树,内存三种查询算法 - Gitee.comhttps://gitee.com/lionsoul/ip2region/tree/master/data 下载解压后只需要 data 目录下的 ip2region.db
ip2region.db 可以复制到 resources 目录下( maven 项目)
//获取ip所在地址 public static String getAddressByIp(String ip) { try { //db URL url = ip2regionTest.class.getClassLoader().getResource("ip2region.db"); String dbPath = url.getFile(); File file = new File(url.getFile()); if (file.exists() == false) { System.out.println("Error: Invalid ip2region.db file"); } //查询算法 int algorithm = DbSearcher.BTREE_ALGORITHM; //B-tree //int algorithm = DbSearcher.BINARY_ALGORITHM; //Binary //int algorithm = DbSearcher.MEMORY_ALGORITYM; //Memory DbConfig config = new DbConfig(); DbSearcher searcher = new DbSearcher(config, dbPath); //define the method Method method = null; switch (algorithm) { case DbSearcher.BTREE_ALGORITHM: method = searcher.getClass().getMethod("btreeSearch", String.class); break; case DbSearcher.BINARY_ALGORITHM: method = searcher.getClass().getMethod("binarySearch", String.class); break; case DbSearcher.MEMORY_ALGORITYM: method = searcher.getClass().getMethod("memorySearch", String.class); break; } DataBlock dataBlock = null; if (Util.isIpAddress(ip) == false) { System.out.println("Error: Invalid ip address"); } dataBlock = (DataBlock) method.invoke(searcher, ip); //address格式:中国|0|广东省|深圳市|电信 String address = dataBlock.getRegion(); //下两行 防止截取报错 在本方法catch String[] splitIpString = address.split("\\|"); String succ = splitIpString[4]; return address; } catch (Exception e) { e.printStackTrace(); return "fail"; } }
ip为14.215.177.38。网上免费查询ip地址显示该ip是在广东省广州市且运营商是电信
public static void main(String[] args) { String addressByIp = getAddressByIp("14.215.177.38"); System.out.println(addressByIp); }
结果正确,该ip查询与网上查询一致