例如:java.net.InetAddress.getByName("72.14.235.104").getHostName()
正确返回"tw-in-f147.google.com"
但:java.net.InetAddress.getByName("211.155.224.227").getHostName()
错误返回"211.155.224.227",而无法得到正确结果"mx3.manufacturer.com"注:通过nslookup可以看到"211.155.224.227"的rdns结果应该是"mx3.manufacturer.com"
为什么有时候得不到正确的结果呢,有其他什么好的办法吗?(用InetAddress.getByAddress()的结果也是一样)
正确返回"tw-in-f147.google.com"
但:java.net.InetAddress.getByName("211.155.224.227").getHostName()
错误返回"211.155.224.227",而无法得到正确结果"mx3.manufacturer.com"注:通过nslookup可以看到"211.155.224.227"的rdns结果应该是"mx3.manufacturer.com"
为什么有时候得不到正确的结果呢,有其他什么好的办法吗?(用InetAddress.getByAddress()的结果也是一样)
getHostName()内部是调用getCanonicalHostName(),而它又是:
获取此 IP 地址的完全限定域名。最大努力方法,意味着根据基础系统配置可能不能返回 FQDN。
因此参考代码如下:import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;public class TestHostName { /*返回ip对应的RDNS
* @param ip 字符串形式的ip
* @return 返回ip对应的RDNS
*/
public static String getRDNS(String ip) throws IOException
{
Process p=Runtime.getRuntime().exec("cmd /c nslookup "+ip);
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
String line=null;
while((line=br.readLine())!=null)
{
if(line.toLowerCase().startsWith("name:"))
return line.substring(line.indexOf(":"));
}
return line;
}
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
System.out.println("211.155.224.227的RDNS是: "+getRDNS("211.155.224.227"));
System.out.println("72.14.235.104的RDNS是: "+getRDNS("72.14.235.104"));
}}
程序运行结果:
211.155.224.227的RDNS是: : mx3.manufacturer.com
72.14.235.104的RDNS是: : tw-in-f104.google.com
不过,这个办法不是我希望的。我确实希望返回和nslookup一致的结果,但应该通过java的基本功能来实现,而不是cmd的方式。
直观来说,我的系统运行在linux平台下,cmd肯定无效的。而且我应该希望得到一个通用(windows/linux都有效)的功能。不过你说的“基础系统配置”是指什么呢?既然nslookup能够得到正确结果,我就希望java本身有对应的实现。
这个功能应该还是比较有用的,java不会没有对应的实现吧?
DNS域名解析是基于UDP的应用层的DNS协议,用JAVA当然能够实现.我一楼的帖子是想省事些做.JAVA的InetAddress类有时是不能完成这个任务的.自己用JAVA来基于UDP的应用层的DNS协议是太麻烦了.其实有许多现成的功能强大的纯JAVA的DNS与RDNS类库包.如:dnsjava.
下面的JAVA是基于dnsjava2.0.6(最新版本)的RDNS解析程序:import org.xbill.DNS.*;
import java.io.IOException;public class RDNS_Java {
public static String reverseDns(String hostIp) throws IOException {
Record opt = null;
Resolver res = new ExtendedResolver(); Name name = ReverseMap.fromAddress(hostIp);
int type = Type.PTR;
int dclass = DClass.IN;
Record rec = Record.newRecord(name, type, dclass);
Message query = Message.newQuery(rec);
Message response = res.send(query); Record[] answers = response.getSectionArray(Section.ANSWER);
if (answers.length == 0)
return hostIp;
else
return answers[0].rdataToString();
} public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
System.out.println("211.155.224.227的RDNS是: "+reverseDns("211.155.224.227"));
System.out.println("72.14.235.104的RDNS是: "+reverseDns("72.14.235.104"));
}}程序运行结果:
211.155.224.227的RDNS是: mx3.manufacturer.com.
72.14.235.104的RDNS是: tw-in-f104.google.com.
不过,“JAVA的InetAddress类有时是不能完成这个任务的”,具体是什么时候呢?