Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法
生活随笔
收集整理的這篇文章主要介紹了
Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
InetAddress類是Java中用于描述IP地址的類。它在java.net包中。在Java中分別用Inet4Address和Inet6Address類來(lái)描述IPv4和IPv6的地址。這兩個(gè)類都是InetAddress的子類。由于InetAddress沒(méi)有public的構(gòu)造方法,因此,要想創(chuàng)建InetAddress對(duì)象,必須得依靠它的四個(gè)靜態(tài)方法。InetAddress可以通過(guò)getLocalHost方法得到本機(jī)的InetAddress對(duì)象,也可以通過(guò)getByName、getAllByName和getByAddress得到遠(yuǎn)程主機(jī)的InetAddress對(duì)象。
一、getLocalHost方法 使用getLocalHost可以得到描述本機(jī)IP的InetAddress對(duì)象。這個(gè)方法的定義如下:
public?static?InetAddress?getLocalHost()?throws?UnknownHostException 這個(gè)方法拋出了一個(gè)UnknownHostException異常,因此,必須在調(diào)用這個(gè)方法的程序中捕捉或拋出這個(gè)異常。下面的代碼演示了如何使用getLocalHost來(lái)得到本機(jī)的IP和計(jì)算機(jī)名。
package inet;
import?java.net.*;
public?class?MyInetAddress1
{
????public?static?void?main(String[]?args)?throws?Exception
????{
????????InetAddress?localAddress?=?InetAddress.getLocalHost();
????????System.out.println(localAddress);?????? ?
????}
}
運(yùn)行結(jié)果:
ComputerName/192.168.18.10 在InetAddress類中覆蓋了Object類的toString方法,實(shí)現(xiàn)如下: public?String?toString()?
{
???? return?((hostName?!=?null)???hostName?:?"")?+?"/"?+?getHostAddress();
}
從上面的代碼可以看出,InetAddress方法中的toString方法返回了用“/“隔開(kāi)的主機(jī)名和IP地址。因此,在上面的代碼中直接通過(guò)localAddress對(duì)象來(lái)輸出本機(jī)計(jì)算機(jī)名和IP地址(將對(duì)象參數(shù)傳入println方法后,println方法會(huì)調(diào)用對(duì)象參數(shù)的toString方法來(lái)輸出結(jié)果)。 當(dāng)本機(jī)綁定了多個(gè)IP時(shí),getLocalHost只返回第一個(gè)IP。如果想返回本機(jī)全部的IP,可以使用getAllByName方法。 二、getByName方法 這個(gè)方法是InetAddress類最常用的方法。它可以通過(guò)指定域名從DNS中得到相應(yīng)的IP地址。getByName一個(gè)String類型參數(shù),可以通過(guò)這個(gè)參數(shù)指定遠(yuǎn)程主機(jī)的域名,它的定義如下:
public?static?InetAddress?getByName(String?host)?throws?UnknownHostException 如果host所指的域名對(duì)應(yīng)多個(gè)IP,getByName返回第一個(gè)IP。如果本機(jī)名已知,可以使用getByName方法來(lái)代替getLocalHost。當(dāng)host的值是localhost時(shí),返回的IP一般是127.0.0.1。如果host是不存在的域名,getByName將拋出UnknownHostException異常,如果host是IP地址,無(wú)論這個(gè)IP地址是否存在,getByName方法都會(huì)返回這個(gè)IP地址(因此getByName并不驗(yàn)證IP地址的正確性)。下面代碼演示了如何使用getByName方法:
??package inet;
??
??import?java.net.*;
??
??public?class MyInetAddress2
??{
??????public?static?void?main(String[]?args)?throws?Exception
??????{
??????????if?(args.length?==?0)
??????????????return;
??????????String?host?=?args[0];
??????????InetAddress?address?=?InetAddress.getByName(host);
??????????System.out.println(address);
??????}
??}
java inet.MyInetAddress2?www.csdn.net 運(yùn)行結(jié)果:
www.csdn.net/211.100.26.124
java?inet.MyInetAddress2 ComputerName 運(yùn)行結(jié)果:
ComputerName/192.168.18.10
java inet.MyInetAddress2 localhost 運(yùn)行結(jié)果:
localhost/127.0.0.1 對(duì)于本機(jī)來(lái)說(shuō),除了可以使用本機(jī)名或localhost外,還可以在hosts文件中對(duì)本機(jī)做“IP/域名”映射(在Windows操作系統(tǒng)下)。這個(gè)文件在C:\WINDOWS\system32\drivers\etc中。打開(kāi)這兩個(gè)文件中,在最后加一行如下所示的字符串: 192.168.18.100?? www.mysite.com
java inet.MyInetAddress2 www.mysite.com 運(yùn)行結(jié)果:
www.mysite.com/192.168.18.100 getByName方法除了可以使用域名作為參數(shù)外,也可以直接使用IP地址作為參數(shù)。如果使用IP地址作為參數(shù),輸出InetAddress對(duì)象時(shí)域名為空(除非調(diào)用getHostName方法后,再輸出InetAddress對(duì)象。getHostName方法將在下面的內(nèi)容介紹)。讀者可以使用129.42.58.212作為MyInetAddress2的命令行參數(shù)(這是www.ibm.com的IP),看看會(huì)得到什么結(jié)果。
三、getAllByName方法 使用getAllByName方法可以從DNS上得到域名對(duì)應(yīng)的所有的IP。這個(gè)方法返回一個(gè)InetAddress類型的數(shù)組。這個(gè)方法的定義如下: ???public?static?InetAddress[]?getAllByName(String?host)?throws?UnknownHostException 與getByName方法一樣,當(dāng)host不存在時(shí),getAllByName也會(huì)拋出UnknowHostException異常,getAllByName也不會(huì)驗(yàn)證IP地址是否存在。下面的代碼演示了getAllByName的用法:
??package inet;
??
??import?java.net.*;
??
??public?class MyInetAddress3
??{
??????public?static?void?main(String[]?args)?throws?Exception
??????{
??????????if?(args.length?==?0)
??????????????return;
??????????String?host?=?args[0];
??????????InetAddress?addresses[]?=?InetAddress.getAllByName(host);
??????????for?(InetAddress?address?:?addresses)
??????????????System.out.println(address);
??????}
??}
java inet.MyInetAddress3 www.csdn.net 運(yùn)行結(jié)果: www.csdn.net/211.100.26.124
www.csdn.net/211.100.26.121
www.csdn.net/211.100.26.122
www.csdn.net/211.100.26.123
將上面的運(yùn)行結(jié)果和例程3-2的測(cè)試1的運(yùn)行結(jié)果進(jìn)行比較,可以得出一個(gè)結(jié)論,getByName方法返回的IP地址就是getAllByName方法返回的第一個(gè)IP地址。事實(shí)上,getByName的確是這樣實(shí)現(xiàn)的,getByName的實(shí)現(xiàn)代碼如下:
public?static?InetAddress?getByName(String?host)?throws?UnknownHostException
{
???? return?InetAddress.getAllByName(host)[0];
}
java inet.MyInetAddress3 211.100.26.122 運(yùn)行結(jié)果: /211.100.26.122 四、getByAddress方法 這個(gè)方法必須通過(guò)IP地址來(lái)創(chuàng)建InetAddress對(duì)象,而且IP地址必須是byte數(shù)組形式。getByAddress方法有兩個(gè)重載形式,定義如下: public?static?InetAddress?getByAddress(byte[]?addr)?throws?UnknownHostException
public?static?InetAddress?getByAddress(String?host,?byte[]?addr)?throws?UnknownHostException
第一個(gè)重載形式只需要傳遞byte數(shù)組形式的IP地址,getByAddress方法并不驗(yàn)證這個(gè)IP地址是否存在,只是簡(jiǎn)單地創(chuàng)建一個(gè)InetAddress對(duì)象。addr數(shù)組的長(zhǎng)度必須是4(IPv4)或16(IPv6),如果是其他長(zhǎng)度的byte數(shù)組,getByAddress將拋出一個(gè)UnknownHostException異常。第二個(gè)重載形式多了一個(gè)host,這個(gè)host和getByName、getAllByName方法中的host的意義不同,getByAddress方法并不使用host在DNS上查找IP地址,這個(gè)host只是一個(gè)用于表示addr的別名。下面的代碼演示了getByAddress的兩個(gè)重載形式的用法:
??package inet;
??
??import?java.net.*;
??
??public?class MyInetAddress4
??{
??????public?static?void?main(String[]?args)?throws?Exception
??????{
??????????byte?ip[]?=?new?byte[] {?(byte)?141,?(byte)?146,?8?,?66};
??????????InetAddress?address1?=?InetAddress.getByAddress(ip);
??????????InetAddress?address2?=?InetAddress.getByAddress("Oracle官方網(wǎng)站",?ip);
??????????System.out.println(address1);
??????????System.out.println(address2);
??????}
??}
上面代碼的運(yùn)行結(jié)果如下: /141.146.8.66
Oracle官方網(wǎng)站/141.146.8.66
從上面的運(yùn)行結(jié)果可以看出,getByAddress只是簡(jiǎn)單地將host參數(shù)作為域名放到“/”前面,因此,host可以是任何字符串。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
一、getLocalHost方法 使用getLocalHost可以得到描述本機(jī)IP的InetAddress對(duì)象。這個(gè)方法的定義如下:
public?static?InetAddress?getLocalHost()?throws?UnknownHostException 這個(gè)方法拋出了一個(gè)UnknownHostException異常,因此,必須在調(diào)用這個(gè)方法的程序中捕捉或拋出這個(gè)異常。下面的代碼演示了如何使用getLocalHost來(lái)得到本機(jī)的IP和計(jì)算機(jī)名。
package inet;
import?java.net.*;
public?class?MyInetAddress1
{
????public?static?void?main(String[]?args)?throws?Exception
????{
????????InetAddress?localAddress?=?InetAddress.getLocalHost();
????????System.out.println(localAddress);?????? ?
????}
}
運(yùn)行結(jié)果:
ComputerName/192.168.18.10 在InetAddress類中覆蓋了Object類的toString方法,實(shí)現(xiàn)如下: public?String?toString()?
{
???? return?((hostName?!=?null)???hostName?:?"")?+?"/"?+?getHostAddress();
}
從上面的代碼可以看出,InetAddress方法中的toString方法返回了用“/“隔開(kāi)的主機(jī)名和IP地址。因此,在上面的代碼中直接通過(guò)localAddress對(duì)象來(lái)輸出本機(jī)計(jì)算機(jī)名和IP地址(將對(duì)象參數(shù)傳入println方法后,println方法會(huì)調(diào)用對(duì)象參數(shù)的toString方法來(lái)輸出結(jié)果)。 當(dāng)本機(jī)綁定了多個(gè)IP時(shí),getLocalHost只返回第一個(gè)IP。如果想返回本機(jī)全部的IP,可以使用getAllByName方法。 二、getByName方法 這個(gè)方法是InetAddress類最常用的方法。它可以通過(guò)指定域名從DNS中得到相應(yīng)的IP地址。getByName一個(gè)String類型參數(shù),可以通過(guò)這個(gè)參數(shù)指定遠(yuǎn)程主機(jī)的域名,它的定義如下:
public?static?InetAddress?getByName(String?host)?throws?UnknownHostException 如果host所指的域名對(duì)應(yīng)多個(gè)IP,getByName返回第一個(gè)IP。如果本機(jī)名已知,可以使用getByName方法來(lái)代替getLocalHost。當(dāng)host的值是localhost時(shí),返回的IP一般是127.0.0.1。如果host是不存在的域名,getByName將拋出UnknownHostException異常,如果host是IP地址,無(wú)論這個(gè)IP地址是否存在,getByName方法都會(huì)返回這個(gè)IP地址(因此getByName并不驗(yàn)證IP地址的正確性)。下面代碼演示了如何使用getByName方法:
??package inet;
??
??import?java.net.*;
??
??public?class MyInetAddress2
??{
??????public?static?void?main(String[]?args)?throws?Exception
??????{
??????????if?(args.length?==?0)
??????????????return;
??????????String?host?=?args[0];
??????????InetAddress?address?=?InetAddress.getByName(host);
??????????System.out.println(address);
??????}
??}
- ?測(cè)試1:遠(yuǎn)程主機(jī)www.csdn.net
java inet.MyInetAddress2?www.csdn.net 運(yùn)行結(jié)果:
www.csdn.net/211.100.26.124
- 測(cè)試2:本機(jī)名ComputerName
java?inet.MyInetAddress2 ComputerName 運(yùn)行結(jié)果:
ComputerName/192.168.18.10
- 測(cè)試3:代表本機(jī)的localhost
java inet.MyInetAddress2 localhost 運(yùn)行結(jié)果:
localhost/127.0.0.1 對(duì)于本機(jī)來(lái)說(shuō),除了可以使用本機(jī)名或localhost外,還可以在hosts文件中對(duì)本機(jī)做“IP/域名”映射(在Windows操作系統(tǒng)下)。這個(gè)文件在C:\WINDOWS\system32\drivers\etc中。打開(kāi)這兩個(gè)文件中,在最后加一行如下所示的字符串: 192.168.18.100?? www.mysite.com
- 測(cè)試4:本機(jī)域名www.mysite.com
java inet.MyInetAddress2 www.mysite.com 運(yùn)行結(jié)果:
www.mysite.com/192.168.18.100 getByName方法除了可以使用域名作為參數(shù)外,也可以直接使用IP地址作為參數(shù)。如果使用IP地址作為參數(shù),輸出InetAddress對(duì)象時(shí)域名為空(除非調(diào)用getHostName方法后,再輸出InetAddress對(duì)象。getHostName方法將在下面的內(nèi)容介紹)。讀者可以使用129.42.58.212作為MyInetAddress2的命令行參數(shù)(這是www.ibm.com的IP),看看會(huì)得到什么結(jié)果。
三、getAllByName方法 使用getAllByName方法可以從DNS上得到域名對(duì)應(yīng)的所有的IP。這個(gè)方法返回一個(gè)InetAddress類型的數(shù)組。這個(gè)方法的定義如下: ???public?static?InetAddress[]?getAllByName(String?host)?throws?UnknownHostException 與getByName方法一樣,當(dāng)host不存在時(shí),getAllByName也會(huì)拋出UnknowHostException異常,getAllByName也不會(huì)驗(yàn)證IP地址是否存在。下面的代碼演示了getAllByName的用法:
??package inet;
??
??import?java.net.*;
??
??public?class MyInetAddress3
??{
??????public?static?void?main(String[]?args)?throws?Exception
??????{
??????????if?(args.length?==?0)
??????????????return;
??????????String?host?=?args[0];
??????????InetAddress?addresses[]?=?InetAddress.getAllByName(host);
??????????for?(InetAddress?address?:?addresses)
??????????????System.out.println(address);
??????}
??}
- 測(cè)試1:遠(yuǎn)程主機(jī)www.csdn.net
java inet.MyInetAddress3 www.csdn.net 運(yùn)行結(jié)果: www.csdn.net/211.100.26.124
www.csdn.net/211.100.26.121
www.csdn.net/211.100.26.122
www.csdn.net/211.100.26.123
將上面的運(yùn)行結(jié)果和例程3-2的測(cè)試1的運(yùn)行結(jié)果進(jìn)行比較,可以得出一個(gè)結(jié)論,getByName方法返回的IP地址就是getAllByName方法返回的第一個(gè)IP地址。事實(shí)上,getByName的確是這樣實(shí)現(xiàn)的,getByName的實(shí)現(xiàn)代碼如下:
public?static?InetAddress?getByName(String?host)?throws?UnknownHostException
{
???? return?InetAddress.getAllByName(host)[0];
}
- ?測(cè)試2:使用www.csdn.net的一個(gè)IP?
java inet.MyInetAddress3 211.100.26.122 運(yùn)行結(jié)果: /211.100.26.122 四、getByAddress方法 這個(gè)方法必須通過(guò)IP地址來(lái)創(chuàng)建InetAddress對(duì)象,而且IP地址必須是byte數(shù)組形式。getByAddress方法有兩個(gè)重載形式,定義如下: public?static?InetAddress?getByAddress(byte[]?addr)?throws?UnknownHostException
public?static?InetAddress?getByAddress(String?host,?byte[]?addr)?throws?UnknownHostException
第一個(gè)重載形式只需要傳遞byte數(shù)組形式的IP地址,getByAddress方法并不驗(yàn)證這個(gè)IP地址是否存在,只是簡(jiǎn)單地創(chuàng)建一個(gè)InetAddress對(duì)象。addr數(shù)組的長(zhǎng)度必須是4(IPv4)或16(IPv6),如果是其他長(zhǎng)度的byte數(shù)組,getByAddress將拋出一個(gè)UnknownHostException異常。第二個(gè)重載形式多了一個(gè)host,這個(gè)host和getByName、getAllByName方法中的host的意義不同,getByAddress方法并不使用host在DNS上查找IP地址,這個(gè)host只是一個(gè)用于表示addr的別名。下面的代碼演示了getByAddress的兩個(gè)重載形式的用法:
??package inet;
??
??import?java.net.*;
??
??public?class MyInetAddress4
??{
??????public?static?void?main(String[]?args)?throws?Exception
??????{
??????????byte?ip[]?=?new?byte[] {?(byte)?141,?(byte)?146,?8?,?66};
??????????InetAddress?address1?=?InetAddress.getByAddress(ip);
??????????InetAddress?address2?=?InetAddress.getByAddress("Oracle官方網(wǎng)站",?ip);
??????????System.out.println(address1);
??????????System.out.println(address2);
??????}
??}
上面代碼的運(yùn)行結(jié)果如下: /141.146.8.66
Oracle官方網(wǎng)站/141.146.8.66
從上面的運(yùn)行結(jié)果可以看出,getByAddress只是簡(jiǎn)單地將host參數(shù)作為域名放到“/”前面,因此,host可以是任何字符串。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Sms中关于操作系统的部署之上
- 下一篇: Windows 2003 server