2010-05-30 5 views
68

Ich bin mir nicht sicher, wie ich die externe IP-Adresse des Rechners bekommen soll, wenn ein Computer außerhalb eines Netzwerks das sieht.Die 'externe' IP-Adresse in Java holen

Meine folgende IPAddress-Klasse erhält nur die lokale IP-Adresse der Maschine.

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

Sie sind sich bewusst, dass eine Maschine viele öffentliche Adressen auf einmal haben kann? Sie sind wirklich mit einer Netzwerkschnittstelle verbunden, keine Maschine. –

Antwort

130

Ich bin mir nicht sicher, ob Sie diese IP aus Code, der auf dem lokalen Computer ausgeführt wird, abrufen können.

Sie jedoch Code erstellen können, die auf einer Website ausgeführt wird, sagen in JSP, und dann etwas verwenden, das die IP-Adresse, wo gibt die Anfrage kam von:

request.getRemoteAddr()

Oder nutzen Sie einfach bereits vorhandene Dienste tue das, dann analysiere die Antwort vom Dienst, um die IP herauszufinden.

Verwenden Sie ein Webservice wie AWS und andere

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

Wort der Warnung: Sie haben die Automatisierungs-URL auf http://automation.whatismyip.com/n09230945.asp – thegrinner

+8

eingestellt Ich würde vorschlagen, mindestens zwei Server, die Ihre IP dient, für den Fall, dass einer von ihnen im Moment ist (mit korrekter Fehlerbehandlung natürlich). Meine Wahl wäre http://www.externalip.net (klicken Sie auf den Link "Brauchen Sie eine API?"). Ich nutze diese Seite seit gut einem Jahr, habe bis jetzt keine Probleme gehabt und es ist ein schneller Service, der immer eine schnelle Antwort liefert. – Felthragar

+0

Ehrfürchtige Verbindung; Ich werde dies als Teil eines Machbarkeitsnachweises für einen Universitätsnetzwerkeinsatz verwenden! – araisbec

5

Machen Sie eine HttpURLConnection bis zu einem gewissen Website wie www.whatismyip.com und analysieren, dass :-)

1

Es ist nicht so einfach, da eine Maschine im Inneren Ein LAN kümmert sich normalerweise nicht um die externe IP seines Routers zum Internet. Es braucht es einfach nicht!

Ich würde vorschlagen, dass Sie dies ausnutzen, indem Sie eine Seite wie http://www.whatismyip.com/ öffnen und die IP-Nummer bekommen, indem Sie die HTML-Ergebnisse analysieren. Es sollte nicht so schwer sein!

+2

Sie müssen nicht html analysieren. Die erste Zeile der Webseitenquelle von http://whatismyip.com/ ist Ihre externe IP. –

15

Die Wahrheit ist, "Sie können nicht" in dem Sinne, dass Sie die Frage gestellt haben. NAT passiert außerhalb des Protokolls. Es gibt keine Möglichkeit für den Kernel Ihres Rechners zu wissen, wie Ihre NAT-Box von externen zu internen IP-Adressaten mappt. Andere Antworten hier bieten Tricks an, bei denen man mit externen Webseiten redet.

+0

Dies sollte viele weitere upvotes für einfach erwähnen NAT bekommen – Eugene

+1

Oder nicht, da es nicht die ursprüngliche Frage beantwortet, und es sieht aus wie eine akademische Übung –

4

http://jstun.javawi.de/ wird es tun - vorausgesetzt, Ihr Gateway-Gerät funktioniert STUN) die meisten tun)

+1

Ziemlich interessant, es funktioniert wie erwartet ohne die Verwendung von externen Diensten, aber einfach zu reden Tor. Die GPL-Lizenz wird jedoch wahrscheinlich ihre Annahme beschränken. –

+0

Site gibt mir einen Login-Bildschirm. Wahrscheinlich nicht das Original. – Jus12

0

Wenn Sie JAVA-basierte Webapp verwenden und wenn Sie wollen, dass die Kunden (One greifen, die die Anfrage über einen Browser) externe IP macht Versuchen Sie, die App in einer Public Domain bereitzustellen und request.getRemoteAddr() zu verwenden, um die externe IP-Adresse zu lesen.

7

Wie @Donal Fellows geschrieben haben, müssen Sie die Netzwerkschnittstelle anstelle der Maschine abfragen.Dieser Code aus dem javadocs für mich gearbeitet:

Das folgende Beispielprogramm listet die alle Netzwerkschnittstellen und die Adressen auf einer Maschine:

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

Die folgende Beispiel ist eine Ausgabe aus dem Beispielprogramm:

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

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

von docs.oracle.com

+1

Danke! Obwohl diese Lösung nicht funktioniert, wenn die Software hinter einer NAT-Software läuft, ist sie immer noch sehr hilfreich für Serversoftware, von der Sie wissen, dass sie sich nicht hinter einer NAT befindet, oder als Ausweichlösung, wenn die Software keine Verbindung zu einem anderen Server herstellen kann IP. Insbesondere für Software, die in LANs ausgeführt werden soll, die nicht mit dem Internet verbunden sind, ist dies der richtige Weg. – pavon

65

einer der Kommentare von @stivlo verdient eine Antwort zu sein:

können Sie den Service von Amazon nutzen 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

nette Antwort, das half mir danke –

7

All dies sind glatt noch und arbeiten! (wie von 19 Dec 2016)

Ratschlag: Nicht direkt von nur einem abhängen; versuchen Sie es mit einem, aber haben Sie einen Notfallplan, der andere berücksichtigt! Je mehr Sie verwenden, desto besser!

Viel Glück!

+1

Curlmyip funktioniert nicht mehr. – Jus12

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

Wie wäre es damit? Es ist einfach und funktionierte das beste für mich :)

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

Das ist ausgezeichnet! Ich werde es versuchen, wenn ich nach Hause komme. Das ist genau die Art von Problemlösung, nach der ich gesucht habe. Ich weiß nicht, warum es nicht höher gewählt wurde. – Adam893