1. 程式人生 > >Java使用InetAddress類獲取主機名和IP地址

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

) 方法, 根據提供的主機名和 IP 地址建立 InetAddress,java程式碼如下:

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.以上內容僅供大家學習參考,寫得不好,請見諒,如有錯誤,請指出,謝謝!