Java使用InetAddress類獲取主機名和IP地址
1.在Java中,地址可以由一個字串來定義,這個字串可以是數字型的地址(其中IPv4的地址型式為:192.168.72.1,其中IPv6的地址型式為:fe20:12a0::0abc:1234),也可以是主機名(如hh.gg.com)。主機名必須被解析成數字型地址才能用來進行通訊。
2.InetAddress類代表了一個網路目標地址,包括主機名和數字型別的地址資訊。該類有兩個子類,Inet4Address和Inet6Address,分別對應了目前IP地址的兩個版本。InetAddress
例項是不可變的,一旦建立,每個例項就始終指向同一個地址。
(1).學習一個類的方法可以檢視API文件,InetAddress類位於java.net包下。
(2).下面我們來介紹一個如何例項化一個InetAddress類,因為此類無構造方法,所以例項化此類有以下幾種靜態方法:
— staticInetAddress getLocalHost() 方法,此方法返回一個InetAddress物件,用來返回本地主機,java程式碼如下:
InetAddress inetAddress=InetAddress.getLocalHost();
— static InetAddress getByName(String host) 方法,此方法返回一個InetAddress物件,用來在給定主機名的情況下確定主機的 IP 地址,java程式碼如下:
InetAddress inetAddress=InetAddress.getByName("Lc");
— static InetAddress getByAddress(byte[] addr) 方法,用來在給定原始IP地址得情況下,返回一個InetAddress物件,java程式碼如下:
InetAddress inetAddress=InetAddress.getByAddress(b);
其中的b為一個位元組陣列 ,引數按網路位元組順序:地址的高位位元組位於 getAddress()[0]
中,IPv4 地址 byte 陣列的長度必須為 4 個位元組,IPv6 byte 陣列的長度必須為 16 個位元組。
— static InetAddress getByAddress(String host,byte[] addr
InetAddress inetAddress=InetAddress.getByAddress("Lc", b);
其中的b為一個位元組陣列,具體意思與上面的b一致。
(3).其中有另外此類有一個特殊的靜態特殊方法:
static InetAddress[ ] getAllByName() 方法,在給定主機名的情況下,根據系統上配置的名稱服務返回其 IP 地址所組成的陣列,java程式碼如下:
InetAddress[] inetAddress=InetAddress.getAllByName("Lc");
(4).接下來附上此類的一些主要方法:
— toString() 方法,將此 IP 地址轉換為 String
。
— byte[ ] getAddress() 方法,返回此 InetAddress
物件的原始 IP 地址。如果將此位元組陣列輸出在控制檯下,會出現一個存放此位元組陣列的記憶體地址。
— String getCanonicalName() 方法, 獲取此 IP 地址的完全限定域名。
— String getHostAddress() 方法,返回 IP 地址字串(以文字表現形式)。
— String getHostName() 方法,獲取此 IP 地址的主機名。
— boolean isReachable(int timeout) 方法,測試是否可以達到該地址。
其他方法請自行檢視API文件。
3.接下來附上一個例子,用來獲取主機名及IP地址:
(1).新建一個包,為com.inetaddress包,在此包下新建一個Address類,程式碼如下:
package com.inetaddress;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Address {
public static void main(String[] args) throws IOException{
InetAddress inetAddress;//宣告InetAddress物件
try {
inetAddress=InetAddress.getLocalHost();//例項化InetAddress物件,返回本地主機
String hostName=inetAddress.getHostName();//獲取本地主機名
String canonicalHostName=inetAddress.getCanonicalHostName();//獲取此 IP地址的完全限定域名
byte[] address=inetAddress.getAddress();//獲取原始IP地址
int a=0;
if(address[3]<0){
a=address[3]+256;
}
String hostAddress=inetAddress.getHostAddress();//獲取本地主機的IP地址
boolean reachable=inetAddress.isReachable(2000);//獲取布林型別,看是否能到達此IP地址
System.out.println(inetAddress.toString());
System.out.println("主機名為:"+hostName);//輸出本地主機名
System.out.println("此IP地址的完全限定域名:"+canonicalHostName);//輸出此IP地址的完全限定域名
System.out.println("原始IP地址為:"+address[0]+"."+address[1]+"."+address[2]+"."+a);//輸出本地主機的原始IP地址
System.out.println("IP地址為:"+hostAddress);//輸出本地主機的IP地址
System.out.println("是否能到達此IP地址:"+reachable);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上面的程式碼存在一點問題,就是獲取原始IP地址時,返回的是一個位元組陣列,如果把這個位元組輸出到控制檯下的話,會顯示此位元組陣列在記憶體中的存放地址,所以我在輸出時用了address[0]等陣列的形式輸出位元組,其中如果位元組陣列中的某個位元組大於128的話,將會導致輸出來的數字是負數,應此我把我的IP地址中超過128的加上256,便沒問題了,我的程式碼僅做測試,正常來說,要把位元組陣列轉換為整型資料型別,再取出來。
(2)執行此類,控制檯輸出如下:
這裡我把IP地址給塗鴉了,請見諒!大家可以自己在機子上實驗一下!
4.以上內容僅供大家學習參考,寫得不好,請見諒,如有錯誤,請指出,謝謝!