考虑到纯真信息库的精确度问题。再探索一下其他几个信息库。
目前使用测试通过了的信息库分别是GeoIP(GeoLite2),IPIP
其中GeoLite2直接去官网下载即可,拥有自动更新数据库的官网软件。下载的格式有2种,一种是2进制,一种是csv格式。
二进制格式的没有测试,但是csv格式的,下载城市版,会发现打开很多乱码的,这个时候需要新建一个Excel表,然后导入数据,选择自文本,选择格式UTF-8,选择分割符号","。
这样打开才是正常中文。
而对于IPIP,下载的免费数据库是ipdb格式。
那么对于IPDB格式的解析,从官网提供到GitHub上的代码可以使用。
但是在使用的时候遇到一个问题,我用的是JAVA版本,github上的缺少了一个IpUtils文件,这个文件网上也搜不到。
我向IPIP公司发邮件询问了一下,公司回复了这个文件给我,在这里共享一下:
package net.ipip.ipdb;
import java.util.Random;
public class IpUtils {
public static String getRandomIp() {
// ip范围
int[][] range = {{607649792, 608174079}, // 36.56.0.0-36.63.255.255
{1038614528, 1039007743}, // 61.232.0.0-61.237.255.255
{1783627776, 1784676351}, // 106.80.0.0-106.95.255.255
{2035023872, 2035154943}, // 121.76.0.0-121.77.255.255
{2078801920, 2079064063}, // 123.232.0.0-123.235.255.255
{-1950089216, -1948778497}, // 139.196.0.0-139.215.255.255
{-1425539072, -1425014785}, // 171.8.0.0-171.15.255.255
{-1236271104, -1235419137}, // 182.80.0.0-182.92.255.255
{-770113536, -768606209}, // 210.25.0.0-210.47.255.255
{-569376768, -564133889}, // 222.16.0.0-222.95.255.255
};
Random rdint = new Random();
int index = rdint.nextInt(10);
String ip = num2ip(range[index][0] + new Random().nextInt(range[index][1] - range[index][0]));
return ip;
}
/*
* 将十进制转换成IP地址
*/
public static String num2ip(int ip) {
int[] b = new int[4];
String x = "";
b[0] = (int) ((ip >> 24) & 0xff);
b[1] = (int) ((ip >> 16) & 0xff);
b[2] = (int) ((ip >> 8) & 0xff);
b[3] = (int) (ip & 0xff);
x = Integer.toString(b[0]) + "." + Integer.toString(b[1]) + "." + Integer.toString(b[2]) + "." + Integer.toString(b[3]);
return x;
}
}
然后就是自己建立一个Main函数,根据官网的demo代码,把IP传入然后在本地数据库里查询得到结果。

本文介绍了如何建立和使用IPv4/IPv6信息库,包括GeoLite2和IPIP的数据库。GeoLite2提供二进制和CSV格式,CSV格式需在Excel中按UTF-8格式导入。IPIP的免费数据库为ipdb格式,解析依赖特定的Java代码,作者通过邮件获得了缺失的IpUtils文件,并实现查询功能。
6952

被折叠的 条评论
为什么被折叠?



