当前位置: 首页 > 知识库问答 >
问题:

MaxMind从IP地址获取LAT/LNG,InvalidDatabaseException错误

盖和洽
2023-03-14

我的最终目标是获得与提供的ip地址相关联的纬度、经度和国家。我正在使用java和MaxMind GeoIP2 java API。我的偏好是不使用他们的webapi,因为我需要快速周转的时间。

有人能告诉我为什么当我调用绑定在MaxMind api调用中的函数时会出现这个错误吗(错误后面显示的代码)?

com.maxmind.db.InvalidDatabaseException: Could not find a MaxMind DB metadata marker in this file (GeoLite2-City-Blocks-IPv6.csv). Is this a valid MaxMind DB file?
at com.maxmind.db.Reader.findMetadataStart(Reader.java:231)
at com.maxmind.db.Reader.<init>(Reader.java:82)
at com.maxmind.db.Reader.<init>(Reader.java:74)
at com.maxmind.geoip2.DatabaseReader.<init>(DatabaseReader.java:41)
at com.maxmind.geoip2.DatabaseReader.<init>(DatabaseReader.java:31)
at com.maxmind.geoip2.DatabaseReader$Builder.build(DatabaseReader.java:126)
at com.tutelatechnologies.tapfortap.server.maxmind.MaxMindLookUp.maxMindLookup(MaxMindLookUp.java:20)
at com.tutelatechnologies.tapfortap.server.cidlaclookup.T4TUtilitiesTest.testMaxMindLookUpTest(T4TUtilitiesTest.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

我的代码:

public class MaxMindLookUp {

public static final void maxMindLookup(final String ipaddress) {
    File db = new File(
            "src/main/java/com/tutelatechnologies/tapfortap/server/maxmind/GeoLite2-City-Blocks-IPv6.csv");
    try {
        DatabaseReader reader = new DatabaseReader.Builder(db).build();
        InetAddress ip = InetAddress.getByName(ipaddress);

        CityResponse response = reader.city(ip);
        Location loc = response.getLocation();

        Double lat = loc.getLatitude();
        Double lng = loc.getLongitude();
        Integer acc = loc.getAccuracyRadius();

        System.out.println("lat=" + lat + "\nlng=" + lng + "\nacc=" + acc);

    } catch (GeoIp2Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

注意:为了运行上面的代码,您需要在Maven Dependencies部分添加一个插件。

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

我没有遇到太多关于SO的确切错误。我已执行调试器,错误发生在这一行:

DatabaseReader reader = new DatabaseReader.Builder(db).build();

我能够使用二进制db文件(geolite2-city.mmdb)使其工作。我留着这个问题,以防任何人有任何更多的信息,为什么CSV db文件不为我工作。

共有1个答案

陆宇航
2023-03-14

您使用的库用于读取GeoIP2的二进制数据库文件。CSV文件供人们加载到数据库中(或他们想要使用CSV的任何其他方式)。

 类似资料:
  • 问题内容: 我正在尝试从IP地址解析主机名,这显然比我想象的要困难得多。 我试过使用一些函数,包括方法,但是所有这些函数似乎都只是返回我输入的IP地址。 这是我正在使用的代码: 问题答案: 例如, 输出:

  • 问题内容: 我正在尝试使用Java获取我的Internet IP地址,但是当我的IP地址为192.168.0.xxx时,我一直在获取本地地址(即:127.0.0.1) 我正在使用该行: 这似乎是获取IP地址的标准方法,但这不是我想要的。每个教程都说要使用此行,所以我有些困惑。 有人可以让我知道如何获取正确的IP地址吗? 我在连接到WiFi的设备上运行,但未使用任何电缆。我正在使用ifconfig

  • get_client_ip($type = 0, $adv = false) 功能 获取客户端IP地址 参数 $type: string 返回类型 0 返回IP地址 1 返回IPV4地址数字 $adv: boolean 是否进行高级模式获取(有可能被伪装) 返回 string 客户端IP地址

  • 问题内容: 我的机器上运行了一个简单的node.js程序,我想获取运行该程序的PC的本地IP地址。如何使用node.js获得它? 问题答案:

  • 但是,这给了我127.0.1.1的IP地址。当我使用时,我得到以下信息 首先,我不知道127.0.1.1是从哪里来的,但不管怎样,这都不是我想要的。当我谷歌的时候,我总是看到相同的语法,Bash脚本或netifaces,我试图使用标准库。 那么如何在Python中获取eth0的IP地址呢?

  • 问题内容: 我如何获得本地IpAddress? 当我使用该功能时,我将无法再继续使用。我不能使用该功能。 是否有其他方法可以执行此操作,或者我是否以错误的方式进行操作? 问题答案: 在讨论中发现,OP需要Mac上的接口地址,而不是我最初想的那样在iOS设备上。问题中引用的代码将检查接口名称“en0”,它是iPhone上的WiFi接口。在Mac上,改为检查任何“正在运行”的界面更有意义。因此,我重写