wake-up-neo.com

Abrufen der "externen" IP-Adresse in Java

Ich bin mir nicht sicher, wie ich die externe IP-Adresse des Geräts ermitteln soll, wenn ein Computer außerhalb eines Netzwerks dies sieht.

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;
    }
}
80
Julio

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, beispielsweise in JSP, und dann etwas verwenden, das die IP 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);
160
bakkal

Einer der Kommentare von @stivlo verdient eine Antwort:

Sie können den Amazon-Dienst verwenden 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();
                }
            }
        }
    }
}
75
Will

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-Adressen abbildet. Andere Antworten Bieten Sie hier Tricks an, bei denen es darum geht, mit externen Websites zu sprechen.

16
bmargulies

Wie @Donal Fellows schrieb, müssen Sie die Netzwerkschnittstelle anstelle des Computers abfragen. Dieser Code aus den Javadocs funktionierte für mich:

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 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

11
domih

Das alles läuft immer noch reibungslos! (Stand: 19. Dezember 2016)

Tipp: Verlassen Sie sich nicht direkt nur auf einen von ihnen; versuchen Sie es mit einem Notfallplan, der andere berücksichtigt! Je mehr Sie verwenden, desto besser!

Viel Glück!

10
FranciscoBouza

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

5
nc3b

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();
        }
    }
}
4
Sparkoenig

http://jstun.javawi.de/ wird es tun - vorausgesetzt Ihr Gateway-Gerät kann STUN)

4
user461467

Es ist nicht so einfach, da eine Maschine in einem LAN normalerweise die externe IP-Adresse ihres Routers für das Internet nicht berücksichtigt. Sie benötigt sie einfach nicht!

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

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

Wenn Sie Java based webapp verwenden und die externe IP des Clients (einer, der die Anfrage über einen Browser stellt) abrufen möchten, versuchen Sie, die App in einem public domain bereitzustellen = und benutze request.getRemoteAddr () um die externe IP Adresse zu lesen.

0
Jay