web-dev-qa-db-fra.com

Obtenir l’adresse IP 'externe' dans Java

Je ne sais pas trop comment obtenir l'adresse IP externe de la machine, car un ordinateur en dehors d'un réseau la verrait.

Ma classe IPAddress suivante obtient uniquement l'adresse IP locale de la machine.

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

Je ne suis pas sûr si vous pouvez récupérer cette adresse IP à partir du code qui s'exécute sur la machine locale.

Vous pouvez toutefois créer du code qui s'exécute sur un site Web, par exemple dans JSP, puis utiliser quelque chose qui renvoie l'adresse IP d'où provient la demande:

request.getRemoteAddr()

Ou utilisez simplement les services existants qui le font, puis analysez la réponse du service pour connaître l'adresse IP.

tilisez un service Web comme AWS et autres

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

Un des commentaires de @stivlo mérite d’être une réponse:

Vous pouvez utiliser le service Amazon 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

La vérité est "vous ne pouvez pas" dans le sens où vous avez posé la question. NAT se situe en dehors du protocole. Le noyau de votre ordinateur n'a aucun moyen de savoir comment votre NAT correspond au mappage d'adresses externes vers des destinataires IP internes. Autres réponses Ici, proposer des astuces impliquant des méthodes de parler à des sites Web extérieurs.

16
bmargulies

Comme @Donal Fellows l'a écrit, vous devez interroger l'interface réseau à la place de la machine. Ce code des javadocs a fonctionné pour moi:

L'exemple de programme suivant répertorie toutes les interfaces réseau et leurs adresses sur une machine:

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

Voici un exemple de sortie du programme exemple:

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

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

De docs.Oracle.com

11
domih

Tout cela est encore en place et fonctionne bien! (à partir du 19 décembre 2016)

Conseil: Ne dépendez pas directement de l’un d’entre eux; essayez d’en utiliser un, mais ayez un plan de contiguïté prenant en compte les autres! Plus vous en utilisez, mieux c'est!

Bonne chance!

10
FranciscoBouza

Créez une connexion HttpURLConnection sur un site tel que www.whatismyip.com et analysez cela :-)

5
nc3b

Que dis-tu de ça? C'est simple et fonctionne le mieux pour moi :)

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/ le fera - à condition que votre périphérique de passerelle STUN) le fasse le plus souvent)

4
user461467

Ce n'est pas si facile, car dans un réseau local, une machine ne se soucie généralement pas de l'adresse IP externe de son routeur vers Internet. Elle n'en a tout simplement pas besoin!

Je vous suggérerais de l'exploiter en ouvrant un site tel que http://www.whatismyip.com/ et en obtenant le numéro IP en analysant les résultats HTML .. cela ne devrait pas être si difficile!

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

Si vous utilisez une application Web basée sur Java et si vous souhaitez récupérer l'adresse IP externe du client (celui qui effectue la demande via un navigateur), essayez de déployer l'application dans un domaine public et utilisez request.getRemoteAddr () pour lire l'adresse IP externe.

0
Jay