欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開發(fā)之InetAddress基礎(chǔ)入門簡介與源碼實(shí)例

 更新時(shí)間:2020年03月19日 16:07:51   作者:姚鏡堂  
這篇文章主要介紹了Android開發(fā)之InetAddress基礎(chǔ)入門簡介,需要的朋友可以參考下

最近在學(xué)習(xí)soket編程中,看到有需要獲取到IP地址之類的需求,所以就去看了下如何獲取到主機(jī)名的IP地址。

其實(shí)就是需要用到一個(gè)類InetAddress。他是在java.net包下面。

InetAddress類的對(duì)象用于IP地址和域名,該類提供以下方法:

getByName(String s):獲得一個(gè)InetAddress 類的對(duì)象,該對(duì)象中含有主機(jī)的IP地址和域名,該對(duì)象用如下格式表示它包含的信息:www.sina.com.cn/202.108.37.40;

String getHostName():獲取InetAddress對(duì)象的域名;

String getHostAddress():獲取InetAddress對(duì)象的IP地址;

getLocalHost():獲得一個(gè)InetAddress對(duì)象,該對(duì)象含有本地機(jī)的域名和IP地址。

private void test() {
    try {
      InetAddress locAdd = InetAddress.getLocalHost(); //得到本地InetAddress對(duì)象
      /* get www.baidu.com's ip */
      InetAddress remAdd = InetAddress.getByName("www.baidu.com"); //取得遠(yuǎn)程InetAddress對(duì)象
      System.out.println("本機(jī)IP地址:" + locAdd.getHostAddress()); //得到本地IP地址
      System.out.println("百度IP地址:" + remAdd.getHostAddress()); //得到百度IP地址
      System.out.println("本機(jī)是否可達(dá):" + locAdd.isReachable(10000)); //10000是超時(shí)時(shí)間,10s
      /*
        打?。?
        本機(jī)IP地址:192.168.1.109
        百度IP地址:115.239.210.26
        本機(jī)是否可達(dá):true
      */
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

很多情況是,某一域名對(duì)應(yīng)的主機(jī)IP是可能有多個(gè)的,我們也可以一一的取回來。如下:

private void test2() {
    try {
      /* 百度可能有多個(gè)IP地址,解析回來,所以我們可以用一個(gè)數(shù)組裝起來 */
      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)位無符號(hào)數(shù)字,它是傳輸層協(xié)議TCP,UDP的基礎(chǔ)。InetAddress是Java對(duì)IP地址的封裝,在java.net中有許多類都使用到了InetAddress,包括ServerSocket,Socket,DatagramSocket等等。

InetAddress的實(shí)例對(duì)象包含以數(shù)字形式保存的IP地址,同時(shí)還可能包含主機(jī)名(如果使用主機(jī)名來獲取InetAddress的實(shí)例,或者使用數(shù)字來構(gòu)造,并且啟用了反向主機(jī)名解析的功能)。InetAddress類提供了將主機(jī)名解析為IP地址(或反之)的方法。

InetAddress對(duì)域名進(jìn)行解析是使用本地機(jī)器配置或者網(wǎng)絡(luò)命名服務(wù)(如域名系統(tǒng)(Domain Name System,DNS)和網(wǎng)絡(luò)信息服務(wù)(Network Information Service,NIS))來實(shí)現(xiàn)。

對(duì)于DNS來說,本地需要向DNS服務(wù)器發(fā)送查詢的請(qǐng)求,然后服務(wù)器根據(jù)一系列的操作,返回對(duì)應(yīng)的IP地址,為了提高效率,通常本地會(huì)緩存一些主機(jī)名與IP地址的映射,這樣訪問相同的地址,就不需要重復(fù)發(fā)送DNS請(qǐng)求了。

在java.net.InetAddress類同樣采用了這種策略。在默認(rèn)情況下,會(huì)緩存一段有限時(shí)間的映射,對(duì)于主機(jī)名解析不成功的結(jié)果,會(huì)緩存非常短的時(shí)間(10秒)來提高性能。

InetAddress類

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

該類沒有構(gòu)造器,可以通過它的兩個(gè)靜態(tài)方法來獲取InetAddress的實(shí)例

>getByName(String host) 根據(jù)主機(jī)名獲取對(duì)應(yīng)的InetAddress對(duì)象

使用IP地址創(chuàng)建InetAddress對(duì)象(getByName,getAllByName,getByAddress方法都可以通過IP地址創(chuàng)建InetAddress對(duì)象)時(shí),并不需要訪問DNS服務(wù)器。因此,通過DNS服務(wù)器查找域名的工作就由getHostName方法來完成。

如果IP地址不存在或DNS服務(wù)器不允許進(jìn)行IP地址和域名映射,就返回這個(gè)IP地址。

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

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

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

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

用域名作為getByName和getAllByName方法的參數(shù)得到的InetAddress對(duì)象,該對(duì)象會(huì)得到這個(gè)域名,當(dāng)調(diào)用 getHostName時(shí),就無需再訪問DNS服務(wù)器,而是直接將這個(gè)域名返回。

InetAddress address=InetAddress.getByName("www.dbjr.com.cn");

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

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

>getByAddress(byte[] addr)根據(jù)源ip地址來獲取InetAddress對(duì)象

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

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

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

該類常用的其他幾個(gè)方法:

try {
	InetAddress address=InetAddress.getLocalHost();
	System.out.println(address.getHostAddress());//輸出ip字符串
	System.out.println(address.getHostName());//輸出用戶名
	System.out.println(address.getCanonicalHostName());//輸出本機(jī)的主機(jī)名.權(quán)限定域名(lan)
} catch (UnknownHostException e) {			
	e.printStackTrace();		
}

getCanonicalHostName()方法

定義:public String getCanonicalHostName()

該方法和getHostName方法一樣,也是得到遠(yuǎn)程主機(jī)的域名。區(qū)別是,該方法得到的是主機(jī)名,getHostName得到的是主機(jī)別名。

1. 使用 getLocalHost() 創(chuàng)建InetAddress對(duì)象

此時(shí)getCanonicalHostName方法和getHostName方法得到的都是本機(jī)名

2. 使用域名 創(chuàng)建InetAddress對(duì)象

使用域名創(chuàng)建InetAddress對(duì)象后,getHostName方法不會(huì)訪問DNS服務(wù)器

但getCanonicalHostName方法就不一定了,這取決于DNS服務(wù)器如何解釋主機(jī)名和主機(jī)別名

3. 使用IP地址 創(chuàng)建InetAddress對(duì)象

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

之所以要使用主機(jī)別名,是因?yàn)橛袝r(shí)主機(jī)名可能比較復(fù)雜,如Oracle官方網(wǎng)站的主機(jī)名bigip-otn-portal.oracle.com,因此,為了使用戶訪問網(wǎng)站更方便,就增加了更簡單的主機(jī)別名,如 www.oracle.com

本文主要介紹了Android InetAddress基礎(chǔ)入門簡介與源碼實(shí)例,更多關(guān)于Android開發(fā)技巧請(qǐng)查看下面的相關(guān)鏈接

相關(guān)文章

  • Android 彈出軟鍵盤所遇到的坑及解決方法

    Android 彈出軟鍵盤所遇到的坑及解決方法

    這篇文章主要介紹了Android 彈出軟鍵盤所遇到的坑及解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2017-01-01
  • Android實(shí)現(xiàn)模擬搜索功能

    Android實(shí)現(xiàn)模擬搜索功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)模擬搜索功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Android 中WallpaperManager用法實(shí)例

    Android 中WallpaperManager用法實(shí)例

    這篇文章主要介紹了Android 中WallpaperManager用法實(shí)例的相關(guān)資料,希望通過本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-09-09
  • Android中對(duì)xml文件解析的3種方式總結(jié)

    Android中對(duì)xml文件解析的3種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Android中對(duì)xml文件解析的3種方式,分別是 Dom 、 SAX 和 dom4j,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • Android布局自定義Shap圓形ImageView可以單獨(dú)設(shè)置背景與圖片

    Android布局自定義Shap圓形ImageView可以單獨(dú)設(shè)置背景與圖片

    這篇文章主要介紹了Android布局自定義Shap圓形ImageView可以單獨(dú)設(shè)置背景與圖片 的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Android AsyncTask實(shí)現(xiàn)機(jī)制詳細(xì)介紹及實(shí)例代碼

    Android AsyncTask實(shí)現(xiàn)機(jī)制詳細(xì)介紹及實(shí)例代碼

    這篇文章主要介紹了Android AsyncTask實(shí)現(xiàn)機(jī)制詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,這里附有示例代碼,幫助大家學(xué)習(xí)理解,需要的朋友可以參考下
    2016-12-12
  • Android切圓角的幾種常見方式總結(jié)

    Android切圓角的幾種常見方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Android切圓角的常見方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 通過Android trace文件分析死鎖ANR實(shí)例過程

    通過Android trace文件分析死鎖ANR實(shí)例過程

    遇到ANR(Application Not Responding)是比較常見的問題,產(chǎn)生ANR的原因有很多,比如CPU使用過高、事件沒有得到及時(shí)的響應(yīng)、死鎖等,下面將通過一次因?yàn)樗梨i導(dǎo)致的ANR問題,來說明如何通過trace文件分析ANR問題
    2013-06-06
  • Android ListView填充數(shù)據(jù)的方法

    Android ListView填充數(shù)據(jù)的方法

    這篇文章主要介紹了Android ListView填充數(shù)據(jù)的方法的相關(guān)資料,大多數(shù)實(shí)現(xiàn)這樣的功能都是使用XML文件,這里就說下不使用布局文件如何實(shí)現(xiàn),需要的朋友可以參考下
    2017-09-09
  • Android recyclerview實(shí)現(xiàn)拖拽排序和側(cè)滑刪除

    Android recyclerview實(shí)現(xiàn)拖拽排序和側(cè)滑刪除

    這篇文章主要為大家詳細(xì)介紹了Android recyclerview實(shí)現(xiàn)拖拽排序和側(cè)滑刪除,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02

最新評(píng)論