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);
}
}
}