1. 程式人生 > 程式設計 >Android開發之InetAddress基礎入門簡介與原始碼例項

Android開發之InetAddress基礎入門簡介與原始碼例項

最近在學習soket程式設計中,看到有需要獲取到IP地址之類的需求,所以就去看了下如何獲取到主機名的IP地址。

其實就是需要用到一個類InetAddress。他是在java.net包下面。

InetAddress類的物件用於IP地址和域名,該類提供以下方法:

getByName(String s):獲得一個InetAddress 類的物件,該物件中含有主機的IP地址和域名,該物件用如下格式表示它包含的資訊:www.sina.com.cn/202.108.37.40;

String getHostName():獲取InetAddress物件的域名;

String getHostAddress():獲取InetAddress物件的IP地址;

getLocalHost():獲得一個InetAddress物件,該物件含有本地機的域名和IP地址。

private void test() {
    try {
      InetAddress locAdd = InetAddress.getLocalHost(); //得到本地InetAddress物件
      /* get www.baidu.com's ip */
      InetAddress remAdd = InetAddress.getByName("www.baidu.com"); //取得遠端InetAddress物件
      System.out.println("本機IP地址:" + locAdd.getHostAddress()); //得到本地IP地址
      System.out.println("百度IP地址:" + remAdd.getHostAddress()); //得到百度IP地址
      System.out.println("本機是否可達:" + locAdd.isReachable(10000)); //10000是超時時間,10s
      /*
        列印:
        本機IP地址:192.168.1.109
        百度IP地址:115.239.210.26
        本機是否可達:true
      */
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

很多情況是,某一域名對應的主機IP是可能有多個的,我們也可以一一的取回來。如下:

private void test2() {
    try {
      /* 百度可能有多個IP地址,解析回來,所以我們可以用一個數組裝起來 */
      InetAddress[] addrs = InetAddress.getAllByName("www.baidu.com");
      if (addrs != null && addrs.length > 0) {
        for (InetAddress addr : addrs) {
          System.out.println("--->" + addr.getHostAddress());
        }
      }
    } catch (UnknownHostException e) {
      e.printStackTrace();
    }
  }

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類

該類代表ip地址,下面還有兩個子類,分別是Inet4Address和Inet6Address他們分別代表IPV4地址和IPV6地址

該類沒有構造器,可以通過它的兩個靜態方法來獲取InetAddress的例項

>getByName(String host) 根據主機名獲取對應的InetAddress物件

使用IP地址建立InetAddress物件(getByName,getAllByName,getByAddress方法都可以通過IP地址建立InetAddress物件)時,並不需要訪問DNS伺服器。因此,通過DNS伺服器查詢域名的工作就由getHostName方法來完成。

如果IP地址不存在或DNS伺服器不允許進行IP地址和域名對映,就返回這個IP地址。

InetAddress address=InetAddress.getByName("141.146.8.66");

System.out.println(address.getHostName());//需要訪問DNS伺服器才能得到域名

InetAddress address=InetAddress.getByName("1.2.3.4");//IP地址不存在

System.out.println(address.getHostName());//直接返回IP地址

用域名作為getByName和getAllByName方法的引數得到的InetAddress物件,該物件會得到這個域名,當呼叫 getHostName時,就無需再訪問DNS伺服器,而是直接將這個域名返回。

InetAddress address=InetAddress.getByName("www.jb51.net");

System.out.println(address.getHostName());//不需要訪問DNS伺服器就能得到域名

try {
	InetAddress address = InetAddress.getByName("www.jb51.net");
	System.out.println(address);//www.jb51.net/119.75.218.70
} catch (UnknownHostException e) {
	e.printStackTrace();
}

>getByAddress(byte[] addr)根據源ip地址來獲取InetAddress物件

InetAddress address;
try {
	address= InetAddress.getByAddress(new byte[]{119,75,218,70});
	System.out.println(address);//輸出結果為:/119.75.218.70和字串str相一致
	address = InetAddress.getByAddress("www.jb51.net",ipBuf);
	System.out.println(address);//輸出結果為www.jb51.net/119.75.218.70
} catch (UnknownHostException e) {
	e.printStackTrace();
}

>InetAddress.getLocalHost()獲取本機的ip地址的主機名

try {
	InetAddress a = InetAddress.getLocalHost();
	System.out.println(a);//本機使用者名稱-PC/本機Ip
} catch (UnknownHostException e) {
	e.printStackTrace();
}

該類常用的其他幾個方法:

try {
	InetAddress address=InetAddress.getLocalHost();
	System.out.println(address.getHostAddress());//輸出ip字串
	System.out.println(address.getHostName());//輸出使用者名稱
	System.out.println(address.getCanonicalHostName());//輸出本機的主機名.許可權定域名(lan)
} catch (UnknownHostException e) {			
	e.printStackTrace();		
}

getCanonicalHostName()方法

定義:public String getCanonicalHostName()

該方法和getHostName方法一樣,也是得到遠端主機的域名。區別是,該方法得到的是主機名,getHostName得到的是主機別名。

1. 使用 getLocalHost() 建立InetAddress物件

此時getCanonicalHostName方法和getHostName方法得到的都是本機名

2. 使用域名 建立InetAddress物件

使用域名建立InetAddress物件後,getHostName方法不會訪問DNS伺服器

但getCanonicalHostName方法就不一定了,這取決於DNS伺服器如何解釋主機名和主機別名

3. 使用IP地址 建立InetAddress物件

此時getCanonicalHostName方法和getHostName方法完全相同,返回的都是主機名,而不是主機別名。

之所以要使用主機別名,是因為有時主機名可能比較複雜,如Oracle官方網站的主機名bigip-otn-portal.oracle.com,因此,為了使使用者訪問網站更方便,就增加了更簡單的主機別名,如 www.oracle.com

本文主要介紹了Android InetAddress基礎入門簡介與原始碼例項,更多關於Android開發技巧請檢視下面的相關連結