MMDB ip地址库操作

MMDB ip地址库操作

@(JAVA)[java]

MMDB即Maxmind DB,是一个设计用于存储IPv4和IPv6的数据信息的数据库,mmdb文件是一个二进制格式的文件,它使用一个二分查找树加速IP信息的查询。

1、数据格式说明

{
    continent => {                    //大洲
        code        => string,        //大洲代码,如AS,可能为空
        names       => {              //大洲名称
            en      => string,        //大洲英文名称,如Asia,可能为空
            zh_CN   => string,        //大洲中文名称,如亚洲,可能为空
        },
    },
    country   => {                    //国家
        iso_code    => string,        //国家iso代码,如CN,可能为空
        names       => {              //国家名称
            en      => string,        //国家英文名称,如China,可能为空
            zh_CN   => string,        //国家中文名称,如中国,可能为空
        },
    },
    subdivisions => {                 //省份
        iso_code    => string,        //省iso代码省ISO代码,如44,可能为空
        names       => {              //省份名称
            en      => string,        //省份英文名称,如Guangdong,可能为空
            zh_CN   => string,        //省份中文名称,如广东,可能为空
        },
    },
    city      => {                    //城市
        id          => int,           //城市id,如440000,可能为空
        names       => {              //城市名称
            en      => string,        //城市英文名称,如Guangzhou,可能为空
            zh_CN   => string,        //城市中文名称,如广州,可能为空
        },
    },
    location  => {                    //地理位置
        latitude    => double,        //纬度,可能为空
        longitude   => double,        //经度,可能为空
        time_zone   => string,        //时区,可能为空
    },
    isp       => {                    //运营商
        id          => int,           //运营商id,可能为空
        names       => {              //运营商名称
            zh_CN   => string,        //运营商中文名称,如电信,可能为空
    },
}

其中:
* 国家ISO代码可以参考维基百科ISO_3166-2。
* 省ISO代码,国内的省ISO代码均为该省公民身份证号的前两位。国外的省ISO代码可能存在为英文的情况,不一定全是数字。具体可以参考维基百科ISO_3166-2。
* 城市id,只有中国IP存在城市id(包含港澳台),该城市id为该城市公民身份证号的前6位。具体可以参考国家统计局网站。
* 运营商id,只有中国大陆的IP存在运营商字段,现有id规则如下:电信10000,联通10010,移动10086,铁通10050,教育网985211,鹏博士600804,华数96171,方正网络9990,歌华网络96196,阿里云1688,其他(包括国内未知)1,国外ip的运营商id为空。
* 运营商名称,中文,如电信,可能为空,只有中国大陆的IP才可能存在运营商字段,中国大陆的IP也可能存在未知运营商的情况,此时运营商字段也为空。
* 使用程序语言解析mmdb的数据可能返回数组、字典或哈希表数据(视编程语言而定)。

2、java读取mmdb文件

可以使用maxmind-db库。在pom.xml中添加以下内容:

    <dependency>
        <groupId>com.maxmind.db</groupId>
        <artifactId>maxmind-db</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.0</version>
    </dependency>

代码如下:

public class IpDemo {
    public static void main(String[] args) throws Exception {
        File database = new File("resources/ip.mmdb");
        Reader reader = new Reader(database);
        InetAddress address = InetAddress.getByName("24.24.24.24");
        JsonNode response = reader.get(address);
        System.out.println(response);
        reader.close();
    }
}

其中ip.mmdb放在resources目录下,这相目录是src folder。输出如下:

{"location":{"time_zone":"America/New_York","longitude":-76.1474,"latitude":43.0481},"isp":{"id":0,"names":{"zh_CN":""}},"continent":{"names":{"zh_CN":"北美洲","en":"North America"},"code":"NA"},"subdivisions":{"names":{"zh_CN":"纽约州","en":"New York"},"iso_code":"NY"},"country":{"names":{"zh_CN":"美国","en":"United States"},"iso_code":"US"},"city":{"id":0,"names":{"zh_CN":"锡拉丘兹","en":"Syracuse"}}}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
通常情况下,我们可以使用第三方IP地址解析来获取IP地址的地理位置信息。以下是使用GeoIP2 Java API进行IP地址解析的示例代码: 1. 首先,将GeoIP2 Java API添加到项目的依赖中。可以在项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.maxmind.geoip2</groupId> <artifactId>geoip2</artifactId> <version>2.14.3</version> </dependency> ``` 2. 然后,使用以下代码来解析IP地址: ```java import java.net.InetAddress; import com.maxmind.geoip2.DatabaseReader; import com.maxmind.geoip2.exception.GeoIp2Exception; import com.maxmind.geoip2.model.CityResponse; public class GeoIpResolver { private final DatabaseReader reader; public GeoIpResolver() throws IOException { reader = new DatabaseReader.Builder(new File("path/to/GeoLite2-City.mmdb")).build(); } public String resolve(String ipAddress) throws IOException, GeoIp2Exception { InetAddress inetAddress = InetAddress.getByName(ipAddress); CityResponse response = reader.city(inetAddress); return response.getCity().getName() + ", " + response.getCountry().getName(); } } ``` 在上面的代码中,我们使用了`DatabaseReader`类来读取MMDB格式的IP地址文件。然后,我们使用`reader.city(inetAddress)`方法来解析IP地址,获取城市和国家信息。最后,我们将城市和国家信息组合成一个字符串返回。 请注意,上述代码中的`path/to/GeoLite2-City.mmdb`应该替换为实际的IP地址文件路径。你可以从MaxMind网站上下载免费的GeoLite2 IP地址文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值