public String getCanonicalHostName()在访问某些域名时,getCanonicalHostName方法和getHostName方法的返回值是一样的,这和DNS服务器如何解释主机名和主机别名以及它们的设置有关。如通过www.ibm.com创建InetAddress对象后,使用getCanonicalHostName方法和getHostName方法返回的结果都是www.ibm.com(有时直接返回IP地址,这可能和IBM的DNS服务器的处理机制有关)。如果DNS不允许通过IP地址得到域名,那么这两个方法就会返回IP地址来代替域名。getCanonicalHostName方法可以分三种情况来讨论:
package mynet;运行结果
import java.net.*;
public class DomainName
{
public static void outHostName(InetAddress address, String s)
{
System.out.println("通过" + s + "创建InetAddress对象");
System.out.println("主 机 名:" + address.getCanonicalHostName());
System.out.println("主机别名:" + address.getHostName());
System.out.println("");
}
public static void main(String[] args) throws Exception
{
outHostName(InetAddress.getLocalHost(), "getLocalHost方法");
outHostName(InetAddress.getByName("www.ibm.com"), "www.ibm.com");
outHostName(InetAddress.getByName("www.126.com"), "www.126.com");
outHostName(InetAddress.getByName("202.108.9.77"), "202.108.9.77");
outHostName(InetAddress.getByName("211.100.26.121"), "211.100.26.121");
}
}
通过getLocalHost方法创建InetAddress对象从上面的运行结果可以看出,如果InetAddress对象是通过IP地址创建的,getCanonicalHostName方法和getHostName方法的值是完全一样的,它们的值可能是主机名,也可能是IP地址。而用域名创建的InetAddress对象就不一定了,它们的值可能相同(相同的IP地址或域名),也可能不相同,如上面运行结果中的www.126.com使用这两个方法得到的值就不同。在一般情况下,我们可以使用getHostName来获得域名,因为如果使用域名来创建InetAddress对象,getHostName所得到的域名就是用来创建InetAddress对象的域名,如果使用IP地址来创建InetAddress对象,getHostName方法等价于getCanonicalHostName方法。
主 机 名:ComputerName
主机别名:ComputerName
通过www.ibm.com创建InetAddress对象
主 机 名:www.ibm.com
主机别名:www.ibm.com
通过www.126.com创建InetAddress对象
主 机 名:zz-9-77-a8.bta.net.cn
主机别名:www.126.com
通过202.108.9.77创建InetAddress对象
主 机 名:zz-9-77-a8.bta.net.cn
主机别名:zz-9-77-a8.bta.net.cn
通过211.100.26.121创建InetAddress对象
主 机 名:211.100.26.121
主机别名:211.100.26.121