天天看點

Java網絡程式設計從入門到精通(6):使用getCanonicalHostName方法獲得主機名

本文為原創,如需轉載,請注明作者和出處,謝謝!

getCanonicalHostName方法和getHostName方法一樣,也是得到遠端主機的域名。但它們有一個差別。getCanonicalHostName得到的是主機名,而getHostName得到的主機名稱。getCanonicalHostName的定義如下:

public String getCanonicalHostName()

在通路某些域名時,getCanonicalHostName方法和getHostName方法的傳回值是一樣的,這和DNS伺服器如何解釋主機名和主機名稱以及它們的設定有關。如通過www.ibm.com建立InetAddress對象後,使用getCanonicalHostName方法和getHostName方法傳回的結果都是www.ibm.com(有時直接傳回IP位址,這可能和IBM的DNS伺服器的處理機制有關)。如果DNS不允許通過IP位址得到域名,那麼這兩個方法就會傳回IP位址來代替域名。getCanonicalHostName方法可以分三種情況來讨論:

1. 使用getLocalHost建立InetAddress對象

在這種情況下getCanonicalHostName方法和getHostName方法得到的都是本機名。

2. 使用域名建立InetAddress對象

在這種情況下,getCanonicalHostName方法是否要通路DNS伺服器,取決于DNS伺服器如何解釋主機名和主機名稱。也就是說,是否在建立InetAddress對象時就将主機名和主機名稱都确定了。在前面已經講過,使用域名建立InetAddress對象後,調用getHostName方法不會通路DNS伺服器。但getCanonicalHostName方法就不一定了。這和DNS伺服器的設定有關。如www.126.com就需要通路DNS伺服器,而www.ibm.com就不需要通路DNS伺服器。

3.使用IP位址建立InetAddress對象

    在這種情況下,getCanonicalHostName方法和getHostName方法是完全一樣的,也就是說,它們得到的都是主機名,而不是主機名稱。

之是以要使用主機名稱,是因為有時主機名可能比較複雜,如Oracle官方網站的主機名bigip-otn-portal.oracle.com,是以,為了使使用者通路網站更友善,就增加了更簡單的主機名稱,如www.oracle.com。一個主機名可能對應多個主機名稱,如oracle.com也是Oracle的主機名稱。在IE的位址欄中輸入http://

bigip-otn-portal.oracle.com和http://oracle.com都可以通路Oracle官方網站。但我們發現,有很多網站通過主機名無法通路,隻有通過一些别名才能通路,如126隻能通過www.126.com和126.com兩個主機名稱通路,而不能通過它的主機名zz-9-77-a8.bta.net.cn來通路。這是因為在服務端通過HTTP協定做了限制,這個在前面已經讨論過了。例程3-8對比了getCanonicalHostName和getHostName方法在不同情況下的輸出結果。

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對象

主 機 名: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

通過211.100.26.121建立InetAddress對象

主 機 名:211.100.26.121

主機名稱:211.100.26.121

    從上面的運作結果可以看出,如果InetAddress對象是通過IP位址建立的,getCanonicalHostName方法和getHostName方法的值是完全一樣的,它們的值可能是主機名,也可能是IP位址。而用域名建立的InetAddress對象就不一定了,它們的值可能相同(相同的IP位址或域名),也可能不相同,如上面運作結果中的www.126.com使用這兩個方法得到的值就不同。在一般情況下,我們可以使用getHostName來獲得域名,因為如果使用域名來建立InetAddress對象,getHostName所得到的域名就是用來建立InetAddress對象的域名,如果使用IP位址來建立InetAddress對象,getHostName方法等價于getCanonicalHostName方法。

<a href="http://www.eoeandroid.com/forumdisplay.php?fid=4">國内最棒的Google Android技術社群(eoeandroid),歡迎通路!</a>

繼續閱讀