查询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”。 空格分隔的字段按顺序排列:
- 优先
- 重量
- 港口
- 服务器
您无法使用标准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记录。