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