Abrufen der 'externen' IP-Adresse in Java

82

Ich bin mir nicht sicher, wie ich die externe IP-Adresse des Computers ermitteln soll, da ein Computer außerhalb eines Netzwerks dies sehen würde.

Meine folgende IPAddress-Klasse erhält nur die lokale IP-Adresse des Computers.

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;
    }
}
Julio
quelle
13
Sie wissen, dass ein Computer viele öffentliche Adressen gleichzeitig haben kann? Sie sind wirklich mit einer Netzwerkschnittstelle verbunden, nicht mit einer Maschine.
Donal Fellows

Antworten:

167

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

Sie können jedoch Code erstellen, der auf einer Website ausgeführt wird, z. B. in JSP, und dann etwas verwenden, das die IP-Adresse zurückgibt, von der die Anforderung stammt:

request.getRemoteAddr()

Oder verwenden Sie einfach bereits vorhandene Dienste, die dies tun, und analysieren Sie dann die Antwort des Dienstes, um die IP herauszufinden.

Verwenden Sie einen 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);
Bakkal
quelle
4
Ein Wort der Warnung: Sie haben die Automatisierungs-URL an automation.whatismyip.com/n09230945.asp
thegrinner
8
Ich würde vorschlagen, mindestens zwei Server zu implementieren, die Ihre IP-Adresse bedienen, falls einer gerade ausfällt (natürlich mit korrekter Fehlerbehandlung). Meine Wahl wäre externalip.net (klicken Sie auf den Link "Benötigen Sie eine API?"). Ich benutze diese Seite seit mehr als einem Jahr, hatte bisher keine Probleme und es ist ein schneller Service, der immer eine schnelle Antwort zurückgibt.
Super Link; Ich werde dies als Teil eines Proof-of-Concept für einen Netzwerkauftrag der Universität verwenden!
Araisbec
Eine andere Alternative wäre, wenn Sie Zugriff auf einen Webserver oder ein Host-Konto haben, auf dem PHP ausgeführt wird. Verwenden Sie einfach den oben angegebenen Code @bakkal und verweisen Sie auf Ihre eigene PHP-Datei, die einfach enthält echo $_SERVER['REMOTE_ADDR'];. Wenn dies die einzige oder erste Ausgabezeile des Skripts ist, sind Sie fertig.
Kingsolmn
7
Whatsmyip.com scheint diese Art der Automatisierung nicht mehr zu unterstützen.
Kingsolmn
78

Einer der Kommentare von @stivlo verdient eine Antwort:

Sie können den Amazon-Dienst http://checkip.amazonaws.com verwenden

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();
                }
            }
        }
    }
}
Wille
quelle
18

Die Wahrheit ist: "Sie können nicht" in dem Sinne, dass Sie die Frage gestellt haben. NAT geschieht außerhalb des Protokolls. Der Kernel Ihres Computers kann nicht erkennen, wie Ihre NAT-Box von externen auf interne IP-Adressen abgebildet wird. Andere Antworten hier bieten Tricks, die Methoden zum Sprechen mit externen Websites beinhalten.

bmargulies
quelle
3
Oder auch nicht, da es die ursprüngliche Frage nicht beantwortet und wie eine akademische Übung aussieht
Bruno Bossola
Um fair zu sein, beantwortet diese Antwort die Frage und die anderen Dutzend Antworten sagen im Grunde dasselbe, zeigen jedoch Code oder URLs, die für eine bestimmte Auswahl an externen IP-Prüfern spezifisch sind.
Thomas Carlisle
13

All dies funktioniert immer noch reibungslos! (Stand 23. September 2019)

Tipp: Verlassen Sie sich nicht direkt auf einen von ihnen; Versuchen Sie, einen zu verwenden, aber haben Sie einen Notfallplan, der andere berücksichtigt! Je mehr Sie verwenden, desto besser!

Viel Glück!

FranciscoBouza
quelle
11

Wie @Donal Fellows schrieb, müssen Sie die Netzwerkschnittstelle anstelle des Computers abfragen. Dieser Code aus den Javadocs hat bei mir funktioniert:

Das folgende Beispielprogramm listet alle Netzwerkschnittstellen und ihre Adressen auf einem Computer auf:

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

Das Folgende ist eine Beispielausgabe des Beispielprogramms:

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

domih
quelle
1
Danke! Obwohl diese Lösung nicht funktioniert, wenn sich die Software hinter einem NAT befindet, ist sie dennoch sehr hilfreich für Serversoftware, von der Sie wissen, dass sie sich nicht hinter einem NAT befindet, oder als Fallback, wenn die Software keine Verbindung zu einem anderen Server herstellen kann, um eine eigene zu erhalten IP. Insbesondere für Software, die in vom Internet getrennten LANs ausgeführt werden soll, ist dies der richtige Weg.
Pavon
5

Stellen Sie eine HttpURLC-Verbindung zu einer Site wie www.whatismyip.com her und analysieren Sie diese :-)

nc3b
quelle
4

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

user461467
quelle
1
Sehr interessant, es funktioniert wie erwartet, ohne externe Dienste zu nutzen, sondern nur mit dem Gateway zu sprechen. Die GPL-Lizenz wird jedoch wahrscheinlich ihre Annahme einschränken.
Bruno Bossola
Die Site gibt mir einen Anmeldebildschirm. Wahrscheinlich nicht das Original.
Jus12
4

Wie wäre es damit? Es ist einfach und hat am besten für mich funktioniert :)

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();
        }
    }
}
Sparkoenig
quelle
Das ist ausgezeichnet! Ich werde es versuchen, wenn ich nach Hause komme. Dies ist genau die Art von Problemlösung, nach der ich gesucht habe. Ich weiß nicht, warum es nicht höher gewählt wurde.
Adam893
1

Es ist nicht so einfach, da sich ein Computer in einem LAN normalerweise nicht um die externe IP seines Routers zum Internet kümmert. Er braucht sie einfach nicht!

Ich würde Ihnen empfehlen, dies auszunutzen, indem Sie eine Website wie http://www.whatismyip.com/ öffnen und die IP-Nummer durch Parsen der HTML-Ergebnisse erhalten. Es sollte nicht so schwer sein!

Jack
quelle
2
Sie müssen HTML nicht analysieren. Die erste Zeile der Webseitenquelle von whatismyip.com ist Ihre externe IP.
Martijn Courteaux
0

Wenn Sie eine JAVA-basierte Webanwendung verwenden und die externe IP-Adresse des Clients (einer, der die Anforderung über einen Browser stellt) abrufen möchten, versuchen Sie, die App in einer öffentlichen Domäne bereitzustellen, und verwenden Sie request.getRemoteAddr (), um die externe IP-Adresse zu lesen.

Jay
quelle
0
System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain"));
Mohsen Abasi
quelle