【原創】Java網路程式設計從入門到精通(2):建立InetAddress物件的四個靜態方法
本文為原創,如需轉載,請註明作者和出處,謝謝!
InetAddress類是Java中用於描述IP地址的類。它在java.net包中。在Java中分別用Inet4Address和Inet6Address類來描述IPv4和IPv6的地址。這兩個類都是InetAddress的子類。由於InetAddress沒有public的構造方法,因此,要想建立InetAddress物件,必須得依靠它的四個靜態方法。InetAddress可以通過getLocalHost方法得到本機的InetAddress物件,也可以通過getByName、getAllByName和getByAddress得到遠端主機的InetAddress物件。
一、getLocalHost方法
使用getLocalHost可以得到描述本機IP的InetAddress物件。這個方法的定義如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public static InetAddress getLocalHost() throws UnknownHostException
這個方法丟擲了一個UnknownHostException異常,因此,必須在呼叫這個方法的程式中捕捉或丟擲這個異常。下面的程式碼演示瞭如何使用getLocalHost來得到本機的IP和計算機名。
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->package inet;
import java.net.*;
public class MyInetAddress1
{
public static void main(String[] args) throws Exception
{
InetAddress localAddress = InetAddress.getLocalHost();
System.out.println(localAddress);
}
}
執行結果:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->ComputerName/192.168.18.10
在InetAddress類中覆蓋了Object類的toString方法,實現如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public String toString()
{
return ((hostName != null) ? hostName : "") + "/" + getHostAddress();
}
從上面的程式碼可以看出,InetAddress方法中的toString方法返回了用“/“隔開的主機名和IP地址。因此,在上面的程式碼中直接通過localAddress物件來輸出本機計算機名和IP地址(將物件引數傳入println方法後,println方法會呼叫物件引數的toString方法來輸出結果)。
當本機繫結了多個IP時,getLocalHost只返回第一個IP。如果想返回本機全部的IP,可以使用getAllByName方法。
二、getByName方法
這個方法是InetAddress類最常用的方法。它可以通過指定域名從DNS中得到相應的IP地址。getByName一個String型別引數,可以通過這個引數指定遠端主機的域名,它的定義如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public static InetAddress getByName(String host) throws UnknownHostException
如果host所指的域名對應多個IP,getByName返回第一個IP。如果本機名已知,可以使用getByName方法來代替getLocalHost。當host的值是localhost時,返回的IP一般是127.0.0.1。如果host是不存在的域名,getByName將丟擲UnknownHostException異常,如果host是IP地址,無論這個IP地址是否存在,getByName方法都會返回這個IP地址(因此getByName並不驗證IP地址的正確性)。下面程式碼演示瞭如何使用getByName方法:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> package inet;
import java.net.*;
public class MyInetAddress2
{
public static void main(String[] args) throws Exception
{
if (args.length == 0)
return;
String host = args[0];
InetAddress address = InetAddress.getByName(host);
System.out.println(address);
}
}
- 測試1:遠端主機www.csdn.net
執行如下命令:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->java inet.MyInetAddress2 www.csdn.net
執行結果:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->www.csdn.net/211.100.26.124
- 測試2:本機名ComputerName
執行如下命令:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->java inet.MyInetAddress2 ComputerName
執行結果:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->ComputerName/192.168.18.10
- 測試3:代表本機的localhost
執行如下命令:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->java inet.MyInetAddress2 localhost
執行結果:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->localhost/127.0.0.1
對於本機來說,除了可以使用本機名或localhost外,還可以在hosts檔案中對本機做“IP/域名”對映(在Windows作業系統下)。這個檔案在C:\WINDOWS\system32\drivers\etc中。開啟這兩個檔案中,在最後加一行如下所示的字串:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->192.168.18.100 www.mysite.com
- 測試4:本機域名www.mysite.com
執行如下命令:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->java inet.MyInetAddress2 www.mysite.com
執行結果:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->www.mysite.com/192.168.18.100
getByName方法除了可以使用域名作為引數外,也可以直接使用IP地址作為引數。如果使用IP地址作為引數,輸出InetAddress物件時域名為空(除非呼叫getHostName方法後,再輸出InetAddress物件。getHostName方法將在下面的內容介紹)。讀者可以使用129.42.58.212作為MyInetAddress2的命令列引數(這是www.ibm.com的IP),看看會得到什麼結果。
三、getAllByName方法
使用getAllByName方法可以從DNS上得到域名對應的所有的IP。這個方法返回一個InetAddress型別的陣列。這個方法的定義如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> public static InetAddress[] getAllByName(String host) throws UnknownHostException
與getByName方法一樣,當host不存在時,getAllByName也會丟擲UnknowHostException異常,getAllByName也不會驗證IP地址是否存在。下面的程式碼演示了getAllByName的用法:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> package inet;
import java.net.*;
public class MyInetAddress3
{
public static void main(String[] args) throws Exception
{
if (args.length == 0)
return;
String host = args[0];
InetAddress addresses[] = InetAddress.getAllByName(host);
for (InetAddress address : addresses)
System.out.println(address);
}
}
- 測試1:遠端主機www.csdn.net
執行如下命令:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->java inet.MyInetAddress3 www.csdn.net
執行結果:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->www.csdn.net/211.100.26.124
www.csdn.net/211.100.26.121
www.csdn.net/211.100.26.122
www.csdn.net/211.100.26.123
將上面的執行結果和例程3-2的測試1的執行結果進行比較,可以得出一個結論,getByName方法返回的IP地址就是getAllByName方法返回的第一個IP地址。事實上,getByName的確是這樣實現的,getByName的實現程式碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public static InetAddress getByName(String host) throws UnknownHostException
{
return InetAddress.getAllByName(host)[0];
}
- 測試2:使用www.csdn.net的一個IP
執行如下命令:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->java inet.MyInetAddress3 211.100.26.122
執行結果:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->/211.100.26.122
四、getByAddress方法
這個方法必須通過IP地址來建立InetAddress物件,而且IP地址必須是byte陣列形式。getByAddress方法有兩個過載形式,定義如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public static InetAddress getByAddress(byte[] addr) throws UnknownHostException
public static InetAddress getByAddress(String host, byte[] addr) throws UnknownHostException
第一個過載形式只需要傳遞byte陣列形式的IP地址,getByAddress方法並不驗證這個IP地址是否存在,只是簡單地建立一個InetAddress物件。addr陣列的長度必須是4(IPv4)或16(IPv6),如果是其他長度的byte陣列,getByAddress將丟擲一個UnknownHostException異常。第二個過載形式多了一個host,這個host和getByName、getAllByName方法中的host的意義不同,getByAddress方法並不使用host在DNS上查詢IP地址,這個host只是一個用於表示addr的別名。下面的程式碼演示了getByAddress的兩個過載形式的用法:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> package inet;
import java.net.*;
public class MyInetAddress4
{
public static void main(String[] args) throws Exception
{
byte ip[] = new byte[] { (byte) 141, (byte) 146, 8 , 66};
InetAddress address1 = InetAddress.getByAddress(ip);
InetAddress address2 = InetAddress.getByAddress("Oracle官方網站", ip);
System.out.println(address1);
System.out.println(address2);
}
}
上面程式碼的執行結果如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->/141.146.8.66
Oracle官方網站/141.146.8.66
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-582303/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【原創】Java網路程式設計從入門到精通(5):使用getHostName方法獲得域名Java程式設計
- Java學習從入門到精通[原創]Java
- 【原創】Java網路程式設計從入門到精通(6):使用getCanonicalHostName方法獲得主機名Java程式設計
- 【原創】Java網路程式設計從入門到精通(8):用getAddress方法獲得IP地址Java程式設計
- 【原創】Java網路程式設計從入門到精通 (9):使用isXxx方法判斷地址型別Java程式設計型別
- Nginx配置靜態檔案服務從入門到精通Nginx
- Java學習從入門到精通(2)(轉)Java
- Android Camera 程式設計從入門到精通Android程式設計
- 網路篇 - http協議從入門到精通HTTP協議
- Docker 從入門到精通(三)一 網路配置Docker
- Java從入門到精通 第七章 類和物件Java物件
- Java學習從入門到精通Java
- 超詳細的程式設計師Java學習路線指南 ,從入門到精通 不看後悔程式設計師Java
- 從入門到精通,Java學習路線導航Java
- 【HTML+CSS網頁設計與佈局 從入門到精通】第2章HTMLCSS網頁
- 真正的Java學習從入門到精通Java
- 好程式設計師分享Python從入門到精通最佳學習路線程式設計師Python
- Java從入門到精通的學習路線你知道嗎?Java
- Java 從入門到精通-反射機制Java反射
- Linux從入門到精通系列之SHELL程式設計變數與四則運算Linux程式設計變數
- 【原創】Java網路程式設計從入門到精通(10):Inet4Address類和Inet6Address類Java程式設計
- Docker從入門到精通(四)——常用命令Docker
- 真正的Java學習從入門到精通(轉)Java
- 移動網際網路之路——Axure RP 8.0網站與APP原型設計從入門到精通網站APP原型
- Thymeleaf從入門到精通
- LESS從入門到精通
- Git 從入門到精通Git
- Shell從入門到精通
- Promise從入門到精通Promise
- vim從入門到精通
- Charles 從入門到精通
- RabbitMQ從入門到精通MQ
- SAP從入門到精通
- redis從入門到精通Redis
- 自學 Java 怎麼入門,怎麼從入門到精通?Java
- Jmeter(五) - 從入門到精通 - 建立網路計劃實戰和建立高階Web測試計劃(詳解教程)JMeterWeb
- Java學習從入門到精通(3)(轉)Java
- 10本程式設計書籍推薦,帶你從入門到精通!程式設計