查询DNS服务记录查找主机名和TCP/IP
在有关生命科学标识符纸(见LSID Tester, a tool for testing Life Science Identifier resolution services),罗德里克博士DM页写道:查询DNS服务记录查找主机名和TCP/IP
鉴于LSID瓮:LSID **: ubio.org **:namebank:11815,查询DNS的SRV记录_lsid._tcp。 ubio.org返回animalia.ubio.org:80作为ubio.org LSID服务的位置。
我才知道,我可以链接_lsid._tcp.ubio.org在UNIX上使用主机命令animalia.ubio.org:80:
host -t srv _lsid._tcp.ubio.org
_lsid._tcp.ubio.org has SRV record 1 0 80 ANIMALIA.ubio.org
我该怎么做“DNS”的东西使用Java的J2SE API(没有任何外部的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.util.InetAddress有一些通过DNS解析名称的方法,但它只能用于将名称解析为IP地址,而不能用于通用DNS查询。
为此,您需要一些外部库,如DNSJava。
你不能使用标准的Java库来做到这一点。 InetAddress
类只能查找DNS A
记录。
要查找SRV
记录(以及除A
记录之外的任何其他DNS资源记录类型),您需要第三方库。 dnsjava
是通常的选择。
我个人在谷歌Android上使用1.6版本,它工作正常。版本2.0和更高版本使用Java nio
层,因此不会与先前的JVM兼容。
如果有人正在寻找非Java的解决方案(他们可能会考虑到问题的标题不是特定于语言的),当我实现LSID时(请参阅doi:10.1186/1751-0473-3-2),我使用了PEAR包Net_DNS,它可以查找SRV记录。
谢谢!看起来很有趣!我将在稍后的WE中测试您的解决方案。 :-) – Pierre 2009-10-25 08:47:36