InetAddress類
InetAddress類用來封裝我們前面討論的數字式的IP地址和該地址的域名。
你通過一個IP主機名與這個類發生作用,IP主機名比它的IP地址用起來更簡便更容易理解。
InetAddress類內部隱藏了地址數字。
InetAddress類中的工廠方法
InetAddress類沒有明顯的構造函數。為生成一個InetAddress對象,必須運用一個可用的工廠方法。
工廠方法(factory method)僅是一個類中靜態方法返回一個該類實例的約定。
對於InetAddress,三個方法:getLocalHost()、getByName()以及getAllByName()可以用來創建InetAddress的實例。
getLocalHost()僅返回象征本地主機的InetAddress對象。
本機地址還為localhost,127.0.0.1,這三個地址都是一回事。
getByName()方法返回一個傳給它的主機名的InetAddress。
如果這些方法不能解析主機名,它們引發一個UnknownHostException異常。
在Internet上,用一個名稱來代表多個機器是常有的事。
getAllByName()工廠方法返回代表由一個特殊名稱分解的所有地址的InetAddresses類數組。
在不能把名稱分解成至少一個地址時,它將引發一個UnknownHostException異常。
IP地址是IP使用的32位(IPv4)或者128位(IPv6)位無符號數字,它是傳輸層協議TCP,UDP的基礎。InetAddress是Java對IP地址的封裝,在java.net中有許多類都使用到了InetAddress,包括ServerSocket,Socket,DatagramSocket等等。
InetAddress的實例對象包含以數字形式保存的IP地址,同時還可能包含主機名(如果使用主機名來獲取InetAddress的實例,或者使用數字來構造,並且啟用了反向主機名解析的功能)。InetAddress類提供了將主機名解析為IP地址(或反之)的方法。
InetAddress對域名進行解析是使用本地機器配置或者網絡命名服務(如域名系統(Domain Name System,DNS)和網絡信息服務(Network Information Service,NIS))來實現。對於DNS來說,本地需要向DNS服務器發送查詢的請求,然后服務器根據一系列的操作,返回對應的IP地址,為了提高效率,通常本地會緩存一些主機名與IP地址的映射,這樣訪問相同的地址,就不需要重復發送DNS請求了。在java.net.InetAddress類同樣采用了這種策略。在默認情況下,會緩存一段有限時間的映射,對於主機名解析不成功的結果,會緩存非常短的時間(10秒)來提高性能。
InetAddress對象的獲取
InetAddress的構造函數不是公開的(public),所以需要通過它提供的靜態方法來獲取,有以下的方法:
static InetAddress[] getAllByName(String host)
static InetAddress getByAddress(byte[] addr)
static InetAddress getByAddress(String host,byte[] addr)
static InetAddress getByName(String host)
static InetAddress getLocalHost()
在這些靜態方法中,最為常用的應該是getByName(String host)方法,只需要傳入目標主機的名字,InetAddress會嘗試做連接DNS服務器,並且獲取IP地址的操作。代碼片段如下,注意我們假設以下的代碼,都是默認導入了java.net中的包,在程序的開頭加上import java.net.*,否則需要指定類的全名java.net.InetAddress。
InetAddress address=InetAddress.getByName("www.baidu.com");
注意到這些方法可能會拋出的異常。如果安全管理器不允許訪問DNS服務器或禁止網絡連接,SecurityException會拋出,如果找不到對應主機的IP地址,或者發生其他網絡I/O錯誤,這些方法會拋出UnknowHostException。所以需要寫如下的代碼:
try { InetAddress address=InetAddress.getByName("www.baidu.com"); System.out.println(address); } catch(UnknownHostException e) { e.printStackTrace(); }
下面是一個實例過程:
import java.net.InetAddress; /** * this example is used to show how to get InetAddress instance * @author Dakiler */ public class Example1 { public static void main(String args[])throws Exception { InetAddress address=InetAddress.getByName("www.baidu.com"); System.out.println(address); System.out.println("-----"); InetAddress[] addresses=InetAddress.getAllByName("www.baidu.com"); for(InetAddress addr:addresses) { System.out.println(addr); } } } 運行結果如下: www.baidu.com/119.75.213.61 ----- www.baidu.com/119.75.213.61 www.baidu.com/119.75.216.30
在這個例子中,我們使用到了getByName()以及getAllByName()兩個方法,前者通過"www.baidu.com"來獲取InetAddress的對象,並且輸出到控制台。System.out.println(address); 默認調用了InetAddress.toString()方法,在結果中可以看到"www.baidu.com/119.75.213.61"的輸出結果,其中119.75.213.61為百度網站的IP地址。
getAllByName()方法是根據主機名返回其可能的所有InetAddress對象,保存在一個數組中。在這個例子中,輸出的結果中,www.baidu.com有兩個ip地址分別為119.75.213.61以及119.75.216.30。
另外一個靜態常用的靜態方法是getLocalHost(),返回的是本地地址,如下例:
import java.net.InetAddress; public class Example2 { public static void main(String args[])throws Exception { InetAddress address=InetAddress.getLocalHost(); System.out.println(address); } }
這個例子首先是根據InetAddress.getLocalHost()方法獲取本地IP地址,然后通過System.out.println()打印出來,結果如下:
dakiler/192.168.1.102