JAVA認(rèn)證:創(chuàng)建InetAddress對(duì)象的四個(gè)靜態(tài)方法

字號(hào):

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方法返回了用“/”隔開的主機(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
    執(zhí)行如下命令:
    java inet.MyInetAddress2 www.csdn.net
    運(yùn)行結(jié)果:
    www.csdn.net/211.100.26.124
    測(cè)試2:本機(jī)名ComputerName
    執(zhí)行如下命令:
    java inet.MyInetAddress2 ComputerName
    運(yùn)行結(jié)果:
    ComputerName/192.168.18.10
    測(cè)試3:代表本機(jī)的localhost
    執(zhí)行如下命令:
    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中。打開這兩個(gè)文件中,在最后加一行如下所示的字符串:
    192.168.18.100 www.mysite.com
    測(cè)試4:本機(jī)域名www.mysite.com
    執(zhí)行如下命令:
    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é)果。