最近在學(xué)習(xí)soket編程中,看到有需要獲取到IP地址之類的需求,所以就去看了下如何獲取到主機(jī)名的IP地址。
烏爾禾ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
其實就是需要用到一個類InetAddress。他是在java.net包下面。
InetAddress類的對象用于IP地址和域名,該類提供以下方法:
getByName(String s):獲得一個InetAddress 類的對象,該對象中含有主機(jī)的IP地址和域名,該對象用如下格式表示它包含的信息:www.sina.com.cn/202.108.37.40;
String getHostName():獲取InetAddress對象的域名;
String getHostAddress():獲取InetAddress對象的IP地址;
getLocalHost():獲得一個InetAddress對象,該對象含有本地機(jī)的域名和IP地址。
private void test() { try { InetAddress locAdd = InetAddress.getLocalHost(); //得到本地InetAddress對象 /* get www.baidu.com's ip */ InetAddress remAdd = InetAddress.getByName("www.baidu.com"); //取得遠(yuǎn)程InetAddress對象 System.out.println("本機(jī)IP地址:" + locAdd.getHostAddress()); //得到本地IP地址 System.out.println("百度IP地址:" + remAdd.getHostAddress()); //得到百度IP地址 System.out.println("本機(jī)是否可達(dá):" + locAdd.isReachable(10000)); //10000是超時時間,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(); } }
很多情況是,某一域名對應(yīng)的主機(jī)IP是可能有多個的,我們也可以一一的取回來。如下:
private void test2() { try { /* 百度可能有多個IP地址,解析回來,所以我們可以用一個數(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)位無符號數(shù)字,它是傳輸層協(xié)議TCP,UDP的基礎(chǔ)。InetAddress是Java對IP地址的封裝,在java.net中有許多類都使用到了InetAddress,包括ServerSocket,Socket,DatagramSocket等等。
InetAddress的實例對象包含以數(shù)字形式保存的IP地址,同時還可能包含主機(jī)名(如果使用主機(jī)名來獲取InetAddress的實例,或者使用數(shù)字來構(gòu)造,并且啟用了反向主機(jī)名解析的功能)。InetAddress類提供了將主機(jī)名解析為IP地址(或反之)的方法。
InetAddress對域名進(jìn)行解析是使用本地機(jī)器配置或者網(wǎng)絡(luò)命名服務(wù)(如域名系統(tǒng)(Domain Name System,DNS)和網(wǎng)絡(luò)信息服務(wù)(Network Information Service,NIS))來實現(xiàn)。
對于DNS來說,本地需要向DNS服務(wù)器發(fā)送查詢的請求,然后服務(wù)器根據(jù)一系列的操作,返回對應(yīng)的IP地址,為了提高效率,通常本地會緩存一些主機(jī)名與IP地址的映射,這樣訪問相同的地址,就不需要重復(fù)發(fā)送DNS請求了。
在java.net.InetAddress類同樣采用了這種策略。在默認(rèn)情況下,會緩存一段有限時間的映射,對于主機(jī)名解析不成功的結(jié)果,會緩存非常短的時間(10秒)來提高性能。
該類代表ip地址,下面還有兩個子類,分別是Inet4Address和Inet6Address他們分別代表IPV4地址和IPV6地址
該類沒有構(gòu)造器,可以通過它的兩個靜態(tài)方法來獲取InetAddress的實例
>getByName(String host) 根據(jù)主機(jī)名獲取對應(yīng)的InetAddress對象
使用IP地址創(chuàng)建InetAddress對象(getByName,getAllByName,getByAddress方法都可以通過IP地址創(chuàng)建InetAddress對象)時,并不需要訪問DNS服務(wù)器。因此,通過DNS服務(wù)器查找域名的工作就由getHostName方法來完成。
如果IP地址不存在或DNS服務(wù)器不允許進(jìn)行IP地址和域名映射,就返回這個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對象,該對象會得到這個域名,當(dāng)調(diào)用 getHostName時,就無需再訪問DNS服務(wù)器,而是直接將這個域名返回。
InetAddress address=InetAddress.getByName("www.jb51.net");
System.out.println(address.getHostName());//不需要訪問DNS服務(wù)器就能得到域名
try { InetAddress address = InetAddress.getByName("www.jb51.net"); System.out.println(address);//www.jb51.net/119.75.218.70 } catch (UnknownHostException e) { e.printStackTrace(); }
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.jb51.net", ipBuf); System.out.println(address);//輸出結(jié)果為www.jb51.net/119.75.218.70 } catch (UnknownHostException e) { e.printStackTrace(); }
try { InetAddress a = InetAddress.getLocalHost(); System.out.println(a);//本機(jī)用戶名-PC/本機(jī)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());//輸出本機(jī)的主機(jī)名.權(quán)限定域名(lan) } catch (UnknownHostException e) { e.printStackTrace(); }
定義:public String getCanonicalHostName()
該方法和getHostName方法一樣,也是得到遠(yuǎn)程主機(jī)的域名。區(qū)別是,該方法得到的是主機(jī)名,getHostName得到的是主機(jī)別名。
此時getCanonicalHostName方法和getHostName方法得到的都是本機(jī)名
使用域名創(chuàng)建InetAddress對象后,getHostName方法不會訪問DNS服務(wù)器
但getCanonicalHostName方法就不一定了,這取決于DNS服務(wù)器如何解釋主機(jī)名和主機(jī)別名
此時getCanonicalHostName方法和getHostName方法完全相同,返回的都是主機(jī)名,而不是主機(jī)別名。
之所以要使用主機(jī)別名,是因為有時主機(jī)名可能比較復(fù)雜,如Oracle官方網(wǎng)站的主機(jī)名bigip-otn-portal.oracle.com,因此,為了使用戶訪問網(wǎng)站更方便,就增加了更簡單的主機(jī)別名,如 www.oracle.com
本文主要介紹了Android InetAddress基礎(chǔ)入門簡介與源碼實例,更多關(guān)于Android開發(fā)技巧請查看下面的相關(guān)鏈接