getCanonicalHostName方法和getHostName方法一樣也是得到遠程主機的域名但它們有一個區別getCanonicalHostName得到的是主機名而getHostName得到的主機別名getCanonicalHostName的定義如下
public String getCanonicalHostName()
在訪問某些域名時getCanonicalHostName方法和getHostName方法的返回值是一樣的這和DNS服務器如何解釋主機名和主機別名以及它們的設置有關如通過創建InetAddress對象後使用getCanonicalHostName方法和getHostName方法返回的結果都是(有時直接返回IP地址這可能和IBM的DNS服務器的處理機制有關)如果DNS不允許通過IP地址得到域名那麼這兩個方法就會返回IP地址來代替域名getCanonicalHostName方法可以分三種情況來討論
使用getLocalHost創建InetAddress對象
在這種情況下getCanonicalHostName方法和getHostName方法得到的都是本機名
使用域名創建InetAddress對象
在這種情況下getCanonicalHostName方法是否要訪問DNS服務器取決於DNS服務器如何解釋主機名和主機別名也就是說是否在創建InetAddress對象時就將主機名和主機別名都確定了在前面已經講過使用域名創建InetAddress對象後調用getHostName方法不會訪問DNS服務器但getCanonicalHostName方法就不一定了這和DNS服務器的設置有關如就需要訪問DNS服務器而就不需要訪問DNS服務器
使用IP地址創建InetAddress對象
在這種情況下getCanonicalHostName方法和getHostName方法是完全一樣的也就是說它們得到的都是主機名而不是主機別名
之所以要使用主機別名是因為有時主機名可能比較復雜如Oracle官方網站的主機名bigipo因此為了使用戶訪問網站更方便就增加了更簡單的主機別名如一個主機名可能對應多個主機別名如也是Oracle的主機別名在IE的地址欄中輸入和都可以訪問Oracle官方網站但我們發現有很多網站通過主機名無法訪問只有通過一些別名才能訪問如只能通過和兩個主機別名訪問而不能通過它的主機名cn來訪問這是因為在服務端通過HTTP協議做了限制這個在前面已經討論過了例程對比了getCanonicalHostName和getHostName方法在不同情況下的輸出結果
package mynet;
import *;
public class DomainName
{
public static void outHostName(InetAddress address String s)
{
Systemoutprintln(通過 + s + 創建InetAddress對象);
Systemoutprintln(主 機 名: + addressgetCanonicalHostName());
Systemoutprintln(主機別名: + addressgetHostName());
Systemoutprintln();
}
public static void main(String[] args) throws Exception
{
outHostName(InetAddressgetLocalHost() getLocalHost方法);
outHostName(InetAddressgetByName() );
outHostName(InetAddressgetByName() );
outHostName(InetAddressgetByName() );
outHostName(InetAddressgetByName() );
}
}
運行結果
通過getLocalHost方法創建InetAddress對象
主 機 名:ComputerName
主機別名:ComputerName
通過創建InetAddress對象
主 機 名:
主機別名:
通過創建InetAddress對象
主 機 名:cn
主機別名:
通過創建InetAddress對象
主 機 名:cn
主機別名:cn
通過創建InetAddress對象
主 機 名:
主機別名:
從上面的運行結果可以看出如果InetAddress對象是通過IP地址創建的getCanonicalHostName方法和getHostName方法的值是完全一樣的它們的值可能是主機名也可能是IP地址而用域名創建的InetAddress對象就不一定了它們的值可能相同(相同的IP地址或域名)也可能不相同如上面運行結果中的使用這兩個方法得到的值就不同在一般情況下我們可以使用getHostName來獲得域名因為如果使用域名來創建InetAddress對象getHostName所得到的域名就是用來創建InetAddress對象的域名如果使用IP地址來創建InetAddress對象getHostName方法等價於getCanonicalHostName方法
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26659.html