Использование dnsjava для запроса с использованием Java? - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь сделать запрос, используя общедоступный DNS-сервер Google (8.8.8.8), чтобы получить IP-адрес известного URL. Тем не менее, кажется, что я не могу получить это с помощью следующего кода? Я использую Java-библиотеку dnsjava. Это мой текущий код

Результаты

        Lookup lookup = new Lookup("stackoverflow.com", Type.NS);
        SimpleResolver resolver=new SimpleResolver("8.8.8.8");

        lookup.setDefaultResolver(resolver);
        lookup.setResolver(resolver);
        Record [] records = lookup.run();
        for (int i = 0; i < records.length; i++) {
            Record  r = (Record ) records[i];
            System.out.println(r.getName()+","+r.getAdditionalName());
        }
    }
    catch (  Exception ex) {
        ex.printStackTrace();
        logger.error(ex.getMessage(),ex);
    }

Результаты:

stackoverflow.com.,ns-1033.awsdns-01.org.
stackoverflow.com.,ns-cloud-e1.googledomains.com.
stackoverflow.com.,ns-cloud-e2.googledomains.com.
stackoverflow.com.,ns-358.awsdns-44.com.

1 Ответ

0 голосов
/ 01 июля 2019

Вам не нужна библиотека DNS только для поиска IP-адреса. Вы можете просто использовать JNDI :

Properties env = new Properties();
env.setProperty(Context.INITIAL_CONTEXT_FACTORY,
    "com.sun.jndi.dns.DnsContextFactory");
env.setProperty(Context.PROVIDER_URL, "dns://8.8.8.8");

DirContext context = new InitialDirContext(env);
Attributes list = context.getAttributes("stackoverflow.com",
    new String[] { "A" });

NamingEnumeration<? extends Attribute> records = list.getAll();
while (records.hasMore()) {
    Attribute record = records.next();
    String name = record.get().toString();
    System.out.println(name);
}

Если вы настаиваете на использовании библиотеки dnsjava, вам нужно использовать Type.A (как изначально делал ваш код перед редактированием).

Глядя на документацию для класса Record , обратите внимание на длинный список в разделе Прямые известные подклассы . Вам необходимо привести каждую запись к соответствующему подклассу, который в данном случае равен ARecord .

После того, как вы сделали это приведение, у вас есть дополнительный метод, getAddress :

for (int i = 0; i < records.length; i++) {
    ARecord r = (ARecord) records[i];
    System.out.println(r.getName() + "," + r.getAdditionalName()
        + " => " + r.getAddress());
}
...