隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

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

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

          上一篇:Java網絡編程從入門到精通(5):使用InetAddress類的getHostName方法獲得域名

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

          public String getCanonicalHostName()

          在訪問某些域名時,getCanonicalHostName方法和getHostName方法的返回值是一樣的,這和DNS服務器如何解釋主機名和主機別名以及它們的設置有關。如通過www.ibm.com創建InetAddress對象后,使用getCanonicalHostName方法和getHostName方法返回的結果都是www.ibm.com(有時直接返回IP地址,這可能和IBMDNS服務器的處理機制有關)。如果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.comhttp://oracle.com都可以訪問Oracle官方網站。但我們發現,有很多網站通過主機名無法訪問,只有通過一些別名才能訪問,如126只能通過www.126.com126.com兩個主機別名訪問,而不能通過它的主機名zz-9-77-a8.bta.net.cn來訪問。這是因為在服務端通過HTTP協議做了限制,這個在前面已經討論過了。例程3-8對比了getCanonicalHostNamegetHostName方法在不同情況下的輸出結果。

          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
          主機別名: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方法。

          下一篇:
          Java網絡編程從入門到精通(7):用getHostAddress方法獲得IP地址





          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-04-14 08:56 銀河使者 閱讀(6577) 評論(0)  編輯  收藏 所屬分類: java 原創網絡編程

          主站蜘蛛池模板: 海原县| 建平县| 葫芦岛市| 腾冲县| 茶陵县| 玉田县| 大余县| 来宾市| 邯郸市| 深泽县| 周至县| 兰州市| 汕头市| 大田县| 温宿县| 崇信县| 南雄市| 沽源县| 弥渡县| 宁波市| 黎平县| 深泽县| 什邡市| 通辽市| 博爱县| 丘北县| 新民市| 高青县| 汝南县| 天祝| 霍林郭勒市| 丘北县| 祁连县| 和林格尔县| 信阳市| 乌拉特前旗| 松阳县| 中超| 宿迁市| 五寨县| 霸州市|