Java網路編程從入門到精通(2):創建InetAddress對象的四個靜態方法

火星人 @ 2014-03-10 , reply:0


InetAddress類是Java中用於描述IP地址的類.它在java.net包中.在Java中分別用Inet4Address和Inet6Address類來描述IPv4和IPv6的地址.這兩個類都是InetAddress的子類.InetAddress沒有public的構造方法,因此,要想創建InetAddress對象,得依靠它的四個靜態方法.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方法,實現如下:

public String toString()
{
return ((hostName != null) ? hostName : "") "/" getHostAddress();
}

從上面的代碼可以看出,InetAddress方法中的toString方法返回了用「/」隔開的主機名和IP地址.因此,在上面的代碼中直接通過localAddress對象來輸出本機計算機名和IP地址(將對象參數傳入println方法后,println方法會調用對象參數的toString方法來輸出結果).

當本機綁定了多個IP時,getLocalHost只返回第一個IP.如果想返回本機全部的IP,可以使用getAllByName方法.

二、getByName方法

這個方法是InetAddress類最常用的方法.它可以通過指定域名從DNS中得到相應的IP地址.getByName一個String類型參數,可以通過這個參數指定遠程主機的域名,它的定義如下:

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操作系統下).這個文件在C:WINDOWSsystem32driversetc中.打開這兩個文件中,在加一行如下所示的字元串:

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方法除了可以使用域名作為參數外,也可以直接使用IP地址作為參數.如果使用IP地址作為參數,輸出InetAddress對象時域名為空(除非調用getHostName方法后,再輸出InetAddress對象.getHostName方法將在下面的內容介紹).讀者可以使用129.42.58.212作為MyInetAddress2的命令行參數(這是www.ibm.com的IP),看看會得到什麼結果.

三、getAllByName方法

使用getAllByName方法可以從DNS上得到域名對應的所有的IP.這個方法返回一個InetAddress類型的數組.這個方法的定義如下:

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的確是這樣實現的,getByName的實現代碼如下:

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地址來創建InetAddress對象,IP地址是byte數組形式.getByAddress方法有兩個重載形式,定義如下:

public static InetAddress getByAddress(byte[] addr) throws UnknownHostException
public static InetAddress getByAddress(String host, byte[] addr) throws UnknownHostException

第一個重載形式只需要傳遞byte數組形式的IP地址,getByAddress方法並不驗證這個IP地址是否存在,只是簡單地創建一個InetAddress對象.addr數組的長度是4(IPv4)或16(IPv6),如果是其他長度的byte數組,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參數作為域名放到「/」前面,因此,host可以是任何字元串.





[火星人 via ] Java網路編程從入門到精通(2):創建InetAddress對象的四個靜態方法已經有411次圍觀

http://www.coctec.com/docs/java/show-post-62218.html