隨筆 - 312, 文章 - 14, 評(píng)論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

          Java網(wǎng)絡(luò)編程從入門到精通(6):使用getCanonicalHostName方法獲得主機(jī)名

          本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!

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

          getCanonicalHostName方法和getHostName方法一樣,也是得到遠(yuǎn)程主機(jī)的域名。但它們有一個(gè)區(qū)別。getCanonicalHostName得到的是主機(jī)名,而getHostName得到的主機(jī)別名。getCanonicalHostName的定義如下:

          public String getCanonicalHostName()

          在訪問(wèn)某些域名時(shí),getCanonicalHostName方法和getHostName方法的返回值是一樣的,這和DNS服務(wù)器如何解釋主機(jī)名和主機(jī)別名以及它們的設(shè)置有關(guān)。如通過(guò)www.ibm.com創(chuàng)建InetAddress對(duì)象后,使用getCanonicalHostName方法和getHostName方法返回的結(jié)果都是www.ibm.com(有時(shí)直接返回IP地址,這可能和IBMDNS服務(wù)器的處理機(jī)制有關(guān))。如果DNS不允許通過(guò)IP地址得到域名,那么這兩個(gè)方法就會(huì)返回IP地址來(lái)代替域名。getCanonicalHostName方法可以分三種情況來(lái)討論:

          1. 使用getLocalHost創(chuàng)建InetAddress對(duì)象

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

          2. 使用域名創(chuàng)建InetAddress對(duì)象

          在這種情況下,getCanonicalHostName方法是否要訪問(wèn)DNS服務(wù)器,取決于DNS服務(wù)器如何解釋主機(jī)名和主機(jī)別名。也就是說(shuō),是否在創(chuàng)建InetAddress對(duì)象時(shí)就將主機(jī)名和主機(jī)別名都確定了。在前面已經(jīng)講過(guò),使用域名創(chuàng)建InetAddress對(duì)象后,調(diào)用getHostName方法不會(huì)訪問(wèn)DNS服務(wù)器。但getCanonicalHostName方法就不一定了。這和DNS服務(wù)器的設(shè)置有關(guān)。如www.126.com就需要訪問(wèn)DNS服務(wù)器,而www.ibm.com就不需要訪問(wèn)DNS服務(wù)器。

          3使用IP地址創(chuàng)建InetAddress對(duì)象

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

          之所以要使用主機(jī)別名,是因?yàn)橛袝r(shí)主機(jī)名可能比較復(fù)雜,如Oracle官方網(wǎng)站的主機(jī)名bigip-otn-portal.oracle.com,因此,為了使用戶訪問(wèn)網(wǎng)站更方便,就增加了更簡(jiǎn)單的主機(jī)別名,如www.oracle.com。一個(gè)主機(jī)名可能對(duì)應(yīng)多個(gè)主機(jī)別名,如oracle.com也是Oracle的主機(jī)別名。在IE的地址欄中輸入http:// bigip-otn-portal.oracle.comhttp://oracle.com都可以訪問(wèn)Oracle官方網(wǎng)站。但我們發(fā)現(xiàn),有很多網(wǎng)站通過(guò)主機(jī)名無(wú)法訪問(wèn),只有通過(guò)一些別名才能訪問(wèn),如126只能通過(guò)www.126.com126.com兩個(gè)主機(jī)別名訪問(wèn),而不能通過(guò)它的主機(jī)名zz-9-77-a8.bta.net.cn來(lái)訪問(wèn)。這是因?yàn)樵诜?wù)端通過(guò)HTTP協(xié)議做了限制,這個(gè)在前面已經(jīng)討論過(guò)了。例程3-8對(duì)比了getCanonicalHostNamegetHostName方法在不同情況下的輸出結(jié)果。

          package mynet;

          import java.net.*;

          public class DomainName
          {
              
          public static void outHostName(InetAddress address, String s)
              {
                  System.out.println(
          "通過(guò)" + s + "創(chuàng)建InetAddress對(duì)象");
                  System.out.println(
          "主 機(jī) 名:" + address.getCanonicalHostName());
                  System.out.println(
          "主機(jī)別名:" + 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");
              }
          }

              運(yùn)行結(jié)果

          通過(guò)getLocalHost方法創(chuàng)建InetAddress對(duì)象
          主 機(jī) 名:ComputerName
          主機(jī)別名:ComputerName

          通過(guò)www.ibm.com創(chuàng)建InetAddress對(duì)象
          主 機(jī) 名:www.ibm.com
          主機(jī)別名:www.ibm.com

          通過(guò)www.
          126.com創(chuàng)建InetAddress對(duì)象
          主 機(jī) 名:zz
          -9-77-a8.bta.net.cn
          主機(jī)別名:www.
          126.com

          通過(guò)202.
          108.9.77創(chuàng)建InetAddress對(duì)象
          主 機(jī) 名:zz
          -9-77-a8.bta.net.cn
          主機(jī)別名:zz
          -9-77-a8.bta.net.cn

          通過(guò)211.
          100.26.121創(chuàng)建InetAddress對(duì)象
          主 機(jī) 名:
          211.100.26.121
          主機(jī)別名:
          211.100.26.121

              從上面的運(yùn)行結(jié)果可以看出,如果InetAddress對(duì)象是通過(guò)IP地址創(chuàng)建的,getCanonicalHostName方法和getHostName方法的值是完全一樣的,它們的值可能是主機(jī)名,也可能是IP地址。而用域名創(chuàng)建的InetAddress對(duì)象就不一定了,它們的值可能相同(相同的IP地址或域名),也可能不相同,如上面運(yùn)行結(jié)果中的www.126.com使用這兩個(gè)方法得到的值就不同。在一般情況下,我們可以使用getHostName來(lái)獲得域名,因?yàn)槿绻褂糜蛎麃?lái)創(chuàng)建InetAddress對(duì)象,getHostName所得到的域名就是用來(lái)創(chuàng)建InetAddress對(duì)象的域名,如果使用IP地址來(lái)創(chuàng)建InetAddress對(duì)象,getHostName方法等價(jià)于getCanonicalHostName方法。

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





          Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺(tái)灣)

          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) 評(píng)論(0)  編輯  收藏 所屬分類: java 原創(chuàng)網(wǎng)絡(luò)編程

          主站蜘蛛池模板: 杭锦后旗| 松阳县| 乐至县| 集安市| 乌审旗| 株洲县| 镇康县| 津南区| 耿马| 华亭县| 高邑县| 乌什县| 东乌| 拜城县| 施秉县| 许昌市| 岳阳市| 宜城市| 延寿县| 康保县| 班玛县| 云浮市| 岢岚县| 浪卡子县| 宁乡县| 海兴县| 来凤县| 赞皇县| 平和县| 滦南县| 安化县| 南岸区| 涿鹿县| 如皋市| 高密市| 仙桃市| 宝兴县| 南岸区| 旬邑县| 咸宁市| 东安县|