2010-05-30 332 views
68

我不太確定如何獲取機器的外部IP地址,因爲網絡外的計算機會看到它。在Java中獲取'外部'IP地址

我的下列IPAddress類只獲取本機的本地IP地址。

public class IPAddress { 

    private InetAddress thisIp; 

    private String thisIpAddress; 

    private void setIpAdd() { 
     try { 
      InetAddress thisIp = InetAddress.getLocalHost(); 
      thisIpAddress = thisIp.getHostAddress().toString(); 
     } catch (Exception e) { 
     } 
    } 

    protected String getIpAddress() { 
     setIpAdd(); 
     return thisIpAddress; 
    } 
} 
+13

您知道一臺機器可以同時擁有多個公共地址嗎?它們確實與網絡接口相關,而不是機器。 – 2010-05-30 15:32:08

回答

130

我不確定您是否可以從本地計算機上運行的代碼獲取該IP。

但是,您可以建立一個網站上運行的代碼,說在JSP中,然後使用一些返回的請求,從哪兒來的IP:

request.getRemoteAddr()

或者乾脆用已經存在的服務這樣做,然後解析來自服務的答案以找出IP。

使用AWS像一個Web服務和其他

import java.net.*; 
import java.io.*; 

URL whatismyip = new URL("http://checkip.amazonaws.com"); 
BufferedReader in = new BufferedReader(new InputStreamReader(
       whatismyip.openStream())); 

String ip = in.readLine(); //you get the IP as a String 
System.out.println(ip); 
+4

警告詞:他們已將自動化網址調整爲http://automation.whatismyip.com/n09230945.asp – thegrinner 2011-12-18 23:48:57

+8

我建議您至少實施兩臺服務器,以便爲您的IP提供服務,以防其中一臺服務器暫時停機(當然有正確的錯誤處理)。我的選擇是http://www.externalip.net(點擊「需要一個API?」鏈接)。這個網站已經使用了一年多,目前沒有任何問題,並且它是一種快速的服務,總是能夠快速回復。 – Felthragar 2012-02-26 09:43:17

+0

真棒鏈接;我將使用它作爲大學網絡任務概念驗證的一部分! – araisbec 2012-11-25 23:56:58

5

做一個HttpURLConnection的一些網站,如www.whatismyip.com和解析:-)

1

這不是那麼容易,因爲一臺機器內一個局域網通常不關心其路由器的外部IP到互聯網..它根本不需要它!

我建議你通過打開一個像http://www.whatismyip.com/這樣的網站並通過解析html結果來獲取IP編號來利用這個。它不應該那麼難!

+2

您不必解析html。 http://whatismyip.com/的網頁源代碼的第一行是您的外部IP。 – 2010-05-30 17:51:25

15

事實是,'你不能'在你提出這個問題的意義上。 NAT在協議之外發生。您的機器內核無法知道您的NAT盒子是如何從外部映射到內部IP地址的。這裏的其他答案提供了涉及與外部網站交談方法的技巧。

+0

這應該得到更多upvotes簡單提及NAT – Eugene 2013-05-21 13:36:22

+1

或不,因爲它不回答原來的問題,它看起來像一個學術活動 – 2015-03-22 13:00:05

4

http://jstun.javawi.de/將做到這一點 - 只要你的網關設備確實STUN)大多數做)

+1

很有趣,它沒有使用外部服務的預期工作,但只是談話網關。然而,GPL許可證可能會限制其採用。 – 2015-03-22 13:09:31

+0

網站給我一個登錄屏幕。可能不是原創。 – Jus12 2016-12-17 05:08:12

0

如果您使用的是基於JAVA的web應用,如果你想抓住客戶的(一個誰通過瀏覽器發出請求)的外部IP嘗試在公共域中部署應用程序,並使用request.getRemoteAddr()讀取外部IP地址。

7

正如@Donal Fellows寫道,您必須查詢網絡接口而不是機器。這從的javadoc代碼爲我工作:

下面的示例程序列出了所有的網絡接口和他們的一臺機器上的地址:

import java.io.*; 
import java.net.*; 
import java.util.*; 
import static java.lang.System.out; 

public class ListNets { 

    public static void main(String args[]) throws SocketException { 
     Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); 
     for (NetworkInterface netint : Collections.list(nets)) 
      displayInterfaceInformation(netint); 
    } 

    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { 
     out.printf("Display name: %s\n", netint.getDisplayName()); 
     out.printf("Name: %s\n", netint.getName()); 
     Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); 
     for (InetAddress inetAddress : Collections.list(inetAddresses)) { 
      out.printf("InetAddress: %s\n", inetAddress); 
     } 
     out.printf("\n"); 
    } 
} 

以下是從示例程序輸出示例:

Display name: TCP Loopback interface 
Name: lo 
InetAddress: /127.0.0.1 

Display name: Wireless Network Connection 
Name: eth0 
InetAddress: /192.0.2.0 

docs.oracle.com

+1

謝謝!雖然當軟件支持NAT時,此解決方案無法工作,但它對於您知道不會在NAT後面的服務器軟件仍然非常有用,或者如果軟件無法連接到另一臺服務器以獲得它自己的服務器軟件IP。特別是對於打算在與互聯網斷開連接的局域網上運行的軟件,這是一條路。 – pavon 2012-11-21 22:25:36

65

一個由@stivlo的意見,不愧爲一個答案:

您可以使用亞馬遜的服務http://checkip.amazonaws.com

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URL; 

public class IpChecker { 

    public static String getIp() throws Exception { 
     URL whatismyip = new URL("http://checkip.amazonaws.com"); 
     BufferedReader in = null; 
     try { 
      in = new BufferedReader(new InputStreamReader(
        whatismyip.openStream())); 
      String ip = in.readLine(); 
      return ip; 
     } finally { 
      if (in != null) { 
       try { 
        in.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+1

很好的答案,這有助於我感謝 – 2013-05-02 04:42:43

7

這一切仍有上漲和工作順利! (作爲二○一六年十二月一十九日)

建議:不要直接依賴其中之一;嘗試使用一個,但有一個考慮他人的緊急計劃!你用的越多越好!

祝你好運!

+1

Curlmyip不再工作。 – Jus12 2016-12-17 05:43:12

0
System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain")); 
3

這個怎麼樣?這很簡單,對我來說最合適:)

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 


public class IP { 
    public static void main(String args[]) { 
     new IP(); 
    } 

    public IP() { 
     URL ipAdress; 

     try { 
      ipAdress = new URL("http://myexternalip.com/raw"); 

      BufferedReader in = new BufferedReader(new InputStreamReader(ipAdress.openStream())); 

      String ip = in.readLine(); 
      System.out.println(ip); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

這很棒!當我回家時我會嘗試。這正是我正在尋找的那種解決問題的方法。不知道爲什麼它沒有被投得更高。 – Adam893 2017-04-09 17:00:20