取得主機位址資訊
在Java中我們使用InetAddress類別來代表目標網路位址,包括主機名稱和數字類型的位址資訊,並且InetAddress的實例是不可變的,每個實例總是指向一個位址。 InetAddress類別包含兩個子類別,分別對應兩個IP位址的版本:
複製代碼代碼如下:
Inet4Address
Inet6Address
我們透過前面的筆記可以知道:IP位址實際上是分配給主機與網路之間的連接,而不是主機本身,NetworkInterface類別提供了存取主機所有介面的資訊的功能。下面我們透過一個簡單的範例程式來學習如何取得網站主機的位址資訊:
複製代碼代碼如下:
importjava.net.*;
importjava.util.Enumeration;
publicclassInetAddressExample{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
try{
//取得主機網路介面列表
Enumeration<NetworkInterface>interfaceList=NetworkInterface
.getNetworkInterfaces();
//偵測介面清單是否為空,即使主機沒有任何其他網路連接,回環介面(loopback)也應該是存在的
if(interfaceList==null){
System.out.println("--沒有發現介面--");
}else{
while(interfaceList.hasMoreElements()){
//取得並列印每個介面的位址
NetworkInterfaceiface=interfaceList.nextElement();
//列印介面名稱
System.out.println("Interface"+iface.getName()+";");
//取得與介面相關聯的位址
Enumeration<InetAddress>addressList=iface
.getInetAddresses();
//是否為空
if(!addressList.hasMoreElements()){
System.out.println("/t(沒有這個介面相關的位址)");
}
//列表的迭代,列印出每個位址
while(addressList.hasMoreElements()){
InetAddressaddress=addressList.nextElement();
System.out
.print("/tAddress"
+((addressinstanceofInet4Address?"(v4)"
:addressinstanceofInet6Address?"v6"
:"(?)")));
System.out.println(":"+address.getHostAddress());
}
}
}
}catch(SocketExceptionse){
System.out.println("取得網路介面錯誤:"+se.getMessage());
}
//取得從命令列輸入的每個參數所對應的主機名稱和位址,迭代列表並列印
for(Stringhost:args){
try{
System.out.println(host+":");
InetAddress[]addressList=InetAddress.getAllByName(host);
for(InetAddressaddress:addressList){
System.out.println("/t"+address.getHostName()+"/"
+address.getHostAddress());
}
}catch(UnknownHostExceptione){
System.out.println("/t無法找到位址:"+host);
}
}
}
}