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的定義如下:
在訪問(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地址,這可能和IBM的DNS服務(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.com和http://oracle.com都可以訪問(wèn)Oracle官方網(wǎng)站。但我們發(fā)現(xiàn),有很多網(wǎng)站通過(guò)主機(jī)名無(wú)法訪問(wèn),只有通過(guò)一些別名才能訪問(wèn),如126只能通過(guò)www.126.com和126.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ì)比了getCanonicalHostName和getHostName方法在不同情況下的輸出結(jié)果。
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é)果
主 機(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ò)編程