1. 程式人生 > >Java網路程式設計之InetAddress類

Java網路程式設計之InetAddress類

InetAddress類是JAVA中用於描述IP地址的類,它在java.net包中。在JAVA中分別用Inet4Address和Inet6Address類來描述IPv4和IPv6的地址。這兩類都是InetAddress的子類。由於InetAddress沒有public的構造方法,因此,要想建立InetAddress物件,必須依靠它的四個靜態方法。

getLocalHost方法
用來得到描述本機IP的InetAddress物件。當查詢不到本機主機的地址時,觸發異常。程式碼如下

package MyInetAddress;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class MyInetAddress {
    public static void main(String[] args) throws Exception
    {
        try{
            InetAddress localAddress = InetAddress.getLocalHost();
            System.out.println(localAddress);
        }
        catch (UnknownHostException el){
            el.printStackTrace();
        }

    }
}

結果顯示:

此程式執行結果不同主機的主機名和IP地址是不同的

在InetAddress類中覆蓋了Object類中的toString方法,實現如下

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

InetAddress方法中的toString方法返回了用“/”隔開的主機名和IP地址。因此上面可以直接通過localAddress物件來輸出本機名和IP地址,在將物件引數傳入println方法後,println方法會呼叫物件引數的toString方法來輸出結果。
本機繫結多個IP時,getLocalHost只返回第一個IP。如果像返回本機全部的IP,可以使用getAllByName方法。

getByName方法
getByName方法是InetAddress類最常用的方法。它可以通過指定域名從DNS中得到相應的IP地址。

如果host所指的域名對應多個IP,getByName返回第一個IP。如果本機名已知可以使用getByName方法來代替getLocalHost。當host的值是localhost時,返回值一般是127.0.0.1,若host是不存在的域名,getByName將丟擲異常,如果host是IP地址,無論這個IP地址是否存在,都會返回這個IP地址(因為getByName並不驗證IP地址的正確性),下面寫一個demo

package MygetByName;
import java.net.*;

public class MygetByName {
    public static void main(String[] args) throws Exception{
        if(args.length == 0)
            return;
        String host = args[0];
        try{
            InetAddress address = InetAddress.getByName(host);
            System.out.println(address);
        }
        catch(UnknownHostException el){
            el.printStackTrace();
        }
    }
}

注意給主函式傳參,若使用控制檯,則直接在正常編譯命令後面加對應引數,若使用eclipse,則在run as裡選中 run configuration 
,選擇第2個選項卡 (x)=Arguments ,在Program arguments裡輸入引數,點下Apply,最後再點Run ,若使用idea,則在run下的Exit Configurations中配置Configuration分頁中的Program arguments選項,就可以進行傳參

執行結果:

getAllByName方法
可以從DNS上得到域名對應的所有IP

package MygetAllByName;

import java.net.InetAddress;

public class MygetAllByName {
    public static void main(String[] args) throws Exception{
        if(args.length == 0)
            return;
        String host = args[0];
        InetAddress addressses[] = InetAddress.getAllByName(host);
        for(InetAddress address : addressses)
            System.out.println(address);
    }
}

結果如下

getHostAddress方法
用來得到主機的IP地址
方法定義如下

public String getHostAddress()

demo如下

package MygetHostAddress;
import java.net.*;

public class MygetHostAddresss {
    public static void main(String[] args){
        try{
            InetAddress ad = InetAddress.getByName(args[0]);
            System.out.println("IP 地址為; " + ad.getHostAddress());
        }catch(UnknownHostException el){
            el.printStackTrace();
        }
    }
}

getAddress方法
與getHostAddrsss方法唯一區別是getHostAddress方法赴安徽的是字串形式的IP地址,getAddress反水的是Byte陣列形式的IP地址。可用來判斷是ipv4 or ipv6,也可用來判斷是ABC哪類地址。demo如下

package MygetAddress;
import java.net.*;

public class MygetAddress {
    public static void main(String[] args){
        try{
            InetAddress inetadd = InetAddress.getLocalHost();
            byte[] address = inetadd.getAddress();
            if(address.length == 4)
            {
                System.out.println("The IP version is ipv4");
                int firstbyte = address[0];
                if(firstbyte < 0)
                    firstbyte += 256;
                System.out.println(firstbyte);
                if(firstbyte <= 127)
                    System.out.println("A");
                else if(firstbyte >=128 && firstbyte <= 191)
                    System.out.println("B");
                else if(firstbyte >=192 && firstbyte <= 223)
                    System.out.println("C");
            }else if(address.length == 16)
                System.out.println("ipv6");
        }catch (Exception e)
        {};
    }
}

getHostName方法
根據給定IP地址查詢主機名
 

package MygetHostName;
import java.net.*;

public class MygetHostName {
    public static void main(String[] args){
        try{
            InetAddress inetadd;
            inetadd = InetAddress.getLocalHost();
            System.out.println("HostName = " + inetadd.getHostName());
            System.out.println(inetadd.toString());
        }catch(Exception e){
            System.out.println(e);
        }
    }
}