2010-02-22 41 views

回答

17

com.google.common.net.InetAddresses.forString(String ipString)對此更好,因爲無論傳遞給它的字符串如何,它都不會執行DNS查找。

+0

這是[Guava]的一部分(http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/com/google/common/net/InetAddresses.html)。 – 2012-06-19 16:37:07

+0

它應該是'com.google.common.net.InetAddresses.forString'(帶有大寫A的'InetAddresses')。因爲編輯必須至少有6個字符,所以我不會允許我在你的回答中糾正這個問題。 ;-) 無論如何,謝謝,正在尋找它,又一次番石榴拯救了這一天。 – silmeth 2016-10-20 14:10:57

13

是的,這將工作。 The API對此非常清楚(「主機名稱可以是機器名稱,例如」java.sun.com「,也可以是其IP地址的文本表示。」),當然,您可以輕鬆檢查自己。

+1

謝謝,我擡頭的API,並錯過了線。 – TiansHUo 2010-02-22 05:49:12

+0

什麼時候主機是一個模式像192.168.0。*?這也能工作嗎?關於Inet4Address doc,似乎支持這一點。 – Paranaix 2012-02-24 13:58:41

+0

@Paranaix,不會,它會拋出一個'IllegalArgumentException',特別是消息「無效主機通配符規範」 – 2012-02-24 16:24:25

3

當心:看來,解析一個無效的地址,如InetAddress.getByName("999.999.999.999")將導致異常正如人們從文檔的這句期待:

地址格式的有效性進行檢查

經驗地說,我發現自己獲得了一個InetAddress實例,其中包含本地計算機的原始IP地址和無效的IP地址作爲主機名。當然,這不是我所期望的!

+2

從Java 7開始,這將拋出UnknownHostException;還沒有檢查早期的Java,但我也期望有一個例外。 – 2015-03-12 12:38:40

0

The open-source IPAddress Java library將驗證IPv6和IPv4的所有標準表示,並且將在沒有DNS查找的情況下進行驗證。免責聲明:我是該圖書館的項目經理。

下面的代碼將做您要求什麼:

 String s = "1.2.3.4"; 
    try { 
      IPAddressString str = new IPAddressString(s); 
      IPAddress addr = str.toAddress(); 
      InetAddress inetAddress = addr.toInetAddress(); //IPv4 or IPv6 
      if(addr.isIPv4() || addr.isIPv4Convertible()) {//IPv4 specific 
       IPv4Address ipv4Addr = addr.toIPv4(); 
       Inet4Address inetAddr = ipv4Addr.toInetAddress(); 
       //use address 
      } 
     } catch(AddressStringException e) { 
      //e.getMessage has validation error 
     } 
相關問題