【原創】Java網路程式設計從入門到精通(6):使用getCanonicalHostName方法獲得主機名
本文為原創,如需轉載,請註明作者和出處,謝謝!
getCanonicalHostName方法和getHostName方法一樣,也是得到遠端主機的域名。但它們有一個區別。getCanonicalHostName得到的是主機名,而getHostName得到的主機別名。getCanonicalHostName的定義如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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方法在不同情況下的輸出結果。
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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");
}
}
執行結果
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->通過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方法。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-588912/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【原創】Java網路程式設計從入門到精通(5):使用getHostName方法獲得域名Java程式設計
- 【原創】Java網路程式設計從入門到精通(8):用getAddress方法獲得IP地址Java程式設計
- Java學習從入門到精通[原創]Java
- 【原創】Java網路程式設計從入門到精通 (9):使用isXxx方法判斷地址型別Java程式設計型別
- 【原創】Java網路程式設計從入門到精通(2):建立InetAddress物件的四個靜態方法Java程式設計物件
- Java 從入門到精通-反射機制Java反射
- 【原創】Java網路程式設計從入門到精通(10):Inet4Address類和Inet6Address類Java程式設計
- Android Camera 程式設計從入門到精通Android程式設計
- 網路篇 - http協議從入門到精通HTTP協議
- Docker 從入門到精通(三)一 網路配置Docker
- Java學習從入門到精通Java
- 從入門到精通,Java學習路線導航Java
- 好程式設計師分享Python從入門到精通最佳學習路線程式設計師Python
- 超詳細的程式設計師Java學習路線指南 ,從入門到精通 不看後悔程式設計師Java
- 移動網際網路之路——Axure RP 8.0網站與APP原型設計從入門到精通網站APP原型
- 《Qt 6.x從入門到精通》簡介QT
- Thymeleaf從入門到精通
- LESS從入門到精通
- Git 從入門到精通Git
- Shell從入門到精通
- Promise從入門到精通Promise
- vim從入門到精通
- Charles 從入門到精通
- RabbitMQ從入門到精通MQ
- SAP從入門到精通
- redis從入門到精通Redis
- 自學 Java 怎麼入門,怎麼從入門到精通?Java
- Java學習從入門到精通(3)(轉)Java
- Java學習從入門到精通(2)(轉)Java
- 真正的Java學習從入門到精通Java
- Java從入門到精通的學習路線你知道嗎?Java
- 10本程式設計書籍推薦,帶你從入門到精通!程式設計
- ElasticSearch 7.8.1 從入門到精通Elasticsearch
- Eclipse從入門到精通Eclipse
- RabbitMQ 從入門到精通 (一)MQ
- ActiveMQ從入門到精通(一)MQ
- ActiveMQ從入門到精通(二)MQ
- Kaizen如何從入門到精通?AI