2010-10-07 197 views
0

如何使用Java獲得我的計算機的廣域網? 我嘗試用這樣的:如何在Java中獲取計算機的WAN IP地址?

ServerSocket ss = new ServerSocket(port); 
System.out.println(ss.getInetAddress().getHostAddress()); 
//wich return 0.0.0.0 

然後我嘗試用這樣的:

System.out.println(InetAddress.getLocalHost().toString()); 
//which return keenan-a658368c/192.168.1.100 < yes it is connected to router 

的功能等說,這回我的本地IP地址

我如何獲得廣域網IP地址?如118.137.43.219

+3

那麼,如果您連接到路由器,您的計算機沒有WAN IP地址。您可以向http://www.whatismyip.com/automation/n09230945.asp發出HTTP請求,它會返回您的互聯網連接(調制解調器)分配的IP地址。 – Strelok 2010-10-07 14:02:48

+0

哦,我明白了,所以我只能依靠外部服務器來知道我的IP。我可以使用我自己的WebServer(我有一個Apache Web服務器運行)或者也許另一個Java程序的PHP腳本(或ASP)? – 2010-10-07 14:27:42

+1

是的你可以:echo $ _SERVER ['REMOTE_ADDR']; – Milan 2010-10-07 14:37:04

回答

2

你可以從http://whatismyip.com/automation/n09230945.asp得到它。你可以打開一個HttpURLConnection到這個站點並解析輸出。

這個計劃應該是有幫助的:

import java.net.HttpURLConnection; 

public class GetExternalIp { 

    public static void main(String args[]) { 
     try { 

      java.net.URL url = new java.net.URL(
        "http://whatismyip.com/automation/n09230945.asp"); 

      java.net.HttpURLConnection con = (HttpURLConnection) url 
        .openConnection(); 

      java.io.InputStream stream = con.getInputStream(); 

      java.io.InputStreamReader reader = new java.io.InputStreamReader(
        stream); 

      java.io.BufferedReader bReader = new java.io.BufferedReader(reader); 

      System.out.print("Your IP address is " + bReader.readLine()); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 

從引用:

http://www.daniweb.com/forums/thread192872.html

http://www.coderanch.com/t/411356/java/java/Public-IP-Address-time-limit

1

正如評論中所述,如果您在執行NAT的路由器的後面,則您的計算機將不知道其WAN地址。

更復雜的情況是您位於NAT池的後面。如果這是真的,那麼您的廣域網地址可能會定期更改,可能每天更新一次或更多。

或者某些類型的流量可能會被強制通過代理。這可能會使出站HTTP請求來自不同於WAN或其他任意協議的WAN地址。

0

一般取決於這樣做有一個設計缺陷的任何代碼 - 你能詳細說明爲什麼你需要獲得NAT路由器的出口IP地址?

出口IP地址不會幫助您創建回連接,因爲路由器通常不會將其轉發給適當的內部主機。

+0

它只是爲用戶,所以它會看起來像:使端口5555上的xxx.xx.xxx.xxx服務器,然後你現在可以訪問該服務器(或ServerSocket對象)在那個ip – 2010-10-08 08:29:08

2

如果您最終使用的遠程服務使用「外部IP地址」進行回覆(請參閱其他答案以瞭解可能的定義),請勿使用其中一種免費的無名稱服務。部署你自己的。您不得構建依賴某人的應用程序,這些應用程序可能會在任何時候離開,而無需通知您或任何其他不幸的用戶。

+0

okaay,然後我將租用一個免費的虛擬主機,然後放置php腳本:D – 2010-10-08 08:27:31

+0

免費託管服務與上面提到的無名稱外部託管PHP腳本差不多。我的觀點是,不要開發任何依賴資源的關鍵業務流程,而這些資源可能會不再需要注意。 – 2010-10-09 17:48:35

0

要得到計算機的主接口的IP地址:

InetAddress.getLocalHost().getHostAddress() 

要獲得所有接口的IP地址:

List<InetAddress> addresses = new LinkedList<InetAddress>(); 
Enumeration<NetworkInterface> ifcs = NetworkInterface.getNetworkInterfaces(); 
while (ifcs.hasMoreElements()) { 
    NetworkInterface ifc = ifcs.nextElement(); 
    for (InterfaceAddress ifcAddr : ifc.getInterfaceAddresses()) { 
     addresses.add(ifcAddr.getAddress()); 
    } 
} 

要獲取IP地址,互聯網上的其他機器就看到你計算機的連接來自YoK的答案。

相關問題