連接到Internet的設(shè)備稱為節(jié)點(node)。計算機節(jié)點稱為主機(host)。每個節(jié)點或主機都由至少一個唯一的數(shù)來標(biāo)識,這稱為Internet地址或IP地址。目前大多數(shù)的IP地址是四字節(jié)長,這被稱作IPv4地址。隨著網(wǎng)絡(luò)地址的不斷增加IPv4已經(jīng)不足現(xiàn)有的計算機使用,所以又出現(xiàn)了16字節(jié)長的地址,稱之為IPv6地址。
為了方便人們記憶,Internet的設(shè)計者發(fā)明了域名系統(tǒng)(Domain Name System,DNS)。DNS將人們可以記憶的主機名與計算機可以記憶的IP地址關(guān)聯(lián)在一起。服務(wù)器通常至少有一個主機名??蛻舳送幸粋€主機名,但也可能沒有。
InetAddress類
java.netInetAddress類是Java對IP地址的高層表示。大多數(shù)其他網(wǎng)絡(luò)類都要用到這個類,包括socket、serverSocket、URL、DatagramSocket、DatagramPacket等。一般地講,它包括一個主機名和一個IP地址。
創(chuàng)建新的InetAddress對象:InetAddress類沒有公共構(gòu)造函數(shù)。實際上,InetAddress有一些靜態(tài)工廠方法,可以連接到DNS服務(wù)器來解析主機名。如:InetAddress.getByName("xxx.com");這個方法會建立與本地DNS服務(wù)器的一個連接,來查找名字和數(shù)字地址,如果DNS服務(wù)器找不到這個地址,這個方法會拋出一個UnKnownEception異常。
緩存:由于DNS查找的開銷可能相當(dāng)大,所以InetAddress類會緩存查找的結(jié)果。一旦得到一個給定主機的地址,就不會再次查找,即使你為同一個主機創(chuàng)建一個新的InetAddress對象,也不會再次查找地址。
按IP查找:調(diào)用getByName()并提供一個IP地址串作為參數(shù)時,會為所請求的IP地址創(chuàng)建一個InetAddress對象,而不檢查DNS。主機名要比IP地址穩(wěn)定得多。有些服務(wù)多年以來一直使用同一個主機名,但IP地址更換了很多次。
Inet4Address和Inet6Address
IPv4地址一般寫為四個無符號字節(jié),每字節(jié)范圍從0到255,最高字節(jié)在前。為方便人們查看,各字節(jié)用點號分隔。例如:152.18.11.123.這稱為點分四段(dotted quad)格式。
IPv6地址通常寫為冒號分隔的8個區(qū)塊,每個區(qū)塊是4個十六進制數(shù)字。例如:2400:cb00:2048:0001:0000:0000:6ca2:c665.前導(dǎo)的0不需要寫出,因此可以簡寫為:2400:cb00:2048:1:0:0:6ca2:c665。
在IPv6和IPv4的混合網(wǎng)絡(luò)中,IPv6地址的最后4個字節(jié)有時寫為IPv4的點分四段地址。
NetworkInterface類
NetworkInterface類表示一個本地IP地址。這可以是一個物理接口,如額外的以太網(wǎng)卡,也可以是一個虛擬接口,與機器的其他IP地址綁定到同一個物理硬件。NetworkInterface類提供了一些方法可以枚舉所有本地地址,并由它們創(chuàng)建InetAddress對象,然后這些InetAddress對象可用于創(chuàng)建socket、服務(wù)器soc等。
一些有用的程序
在了解了InetAddress一些知識之后,我們可以編寫一些很有用的程序。比如IP過濾系統(tǒng),每個請求的IP過來的時候,我們可以進行一些匹配過濾,而保證服務(wù)器的安全。還可以寫一些web服務(wù)器文件日志系統(tǒng),來記錄每個訪客的IP。