查询DNS服务记录以查找主机名和TCP / IP

在一篇关于生命科学标识符的论文中 (参见LSID Tester,一种测试生命科学标识符解析服务的工具 ),Roderic DM Page博士写道:

鉴于LSID urn:lsid **:ubio.org **:namebank:11815,查询DNS以获取_lsid._tcp的SRV记录。 ubio.org返回animalia.ubio.org:80作为ubio.org LSID服务的位置。

我了解到我可以使用unix上的host命令将_lsid._tcp.ubio.org链接到animalia.ubio.org:80:

host -t srv _lsid._tcp.ubio.org _lsid._tcp.ubio.org has SRV record 1 0 80 ANIMALIA.ubio.org 

如何使用Java J2SE API执行此“DNS”操作(没有任何外部Java库,我想要一个轻量级的解决方案)?

谢谢

JNDI DNS提供程序可以查找SRV记录。 你需要做一些事情:

 Hashtable env = new Hashtable(); env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); env.put("java.naming.provider.url", "dns:"); DirContext ctx = new InitialDirContext(env); Attributes attrs = ctx.getAttributes("_lsid._tcp.ubio.org", new String[] { "SRV" }); 

返回的属性是字符串的枚举,看起来像“1 0 80 ANIMALIA.ubio.org”。 空格分隔的字段按顺序排列:

  1. 优先
  2. 重量
  3. 港口
  4. 服务器

您无法使用标准Java库执行此操作。 InetAddress类只能查找DNS A记录。

要查找SRV记录(以及除A记录以外的任何其他DNS资源记录类型),您需要第三方库。 dnsjava是通常的选择。

我个人在谷歌Android上使用1.6版本,它运行正常。 2.0版及更高版本使用Java nio层,因此与早期的JVM不兼容。

我认为如果不使用一些外部库,你就无法做到。 java.util.InetAddress有一些通过DNS解析名称的方法,但它只能用于将名称解析为IP地址而不能用于通用DNS查询。

为此,您需要一些外部库,如DNSJava 。

如果有人正在寻找非Java解决方案(他们可能会给出问题的标题不是特定于语言的),当我实现LSID时(参见doi:10.1186 / 1751-0473-3-2 )我使用了PEAR包Net_DNS ,可以查找SRV记录。