java.net.InetAddress類的使用

來源:互聯網
上載者:User

 . java.net.InetAddress類的使用

1.1. 簡介

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秒)來提高效能。

1.2. 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();

}

下面是一則完整的例子:

package org.dakiler.javanet.chapter1;

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(),返回的是本地地址,如下例:

package org.dakiler.javanet.chapter1;

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.