9 Domanda: Java ottiene il mio indirizzo IP

domanda creata a Thu, Nov 10, 2011 12:00 AM

Sto cercando di ottenere il mio indirizzo IP Internet in Java, ma continuo a ricevere il mio indirizzo locale (es: 127.0.0.1), quando il mio indirizzo IP è 192.168.0.xxx

Sto usando la linea:

 
InetAddress.getLocalHost().getHostAddress();

che sembra standard per ottenere l'indirizzo IP, ma non è quello che sto cercando. Ogni tutorial dice di usare questa linea, quindi sono un po 'confuso.

Qualcuno potrebbe farmi sapere come posso ottenere il mio indirizzo IP corretto per favore?


Sono in esecuzione su un dispositivo connesso a WiFi e non sto utilizzando alcun cavo. Mi sto collegando a un server usando l'IP fornito da ifronfig inet addr e sto cercando di ottenere l'addr del dispositivo. Potrei controllare l'IP del socket sul lato server, ma ho pensato che sarebbe stato più bello se il dispositivo (client) indica al server quale IP si aspetta che altri dispositivi si colleghino.

    
27
  1. È possibile che ci si connetta al server attraverso l'host locale? Questo codice è in esecuzione sul server o su un'app desktop o cosa?
    2011-11-10 17: 12: 49Z
  2. Che cos'è "l'indirizzo IP"? Il mio computer ha attualmente almeno cinque.
    2011-11-10 17: 13: 18Z
  3. Hmm dai documenti: If there is a security manager, its checkConnect method is called with the local host name and -1 as its arguments to see if the operation is allowed. If the operation is not allowed, an InetAddress representing the loopback address is returned.
    2011-11-10 17: 14: 54Z
  4. Sono in esecuzione su un dispositivo connesso a WiFi e non sto utilizzando alcun cavo. Mi sto connettendo a un server utilizzando l'IP fornito da ifronfig inet addr e sto cercando di ottenere l'indirizzo aggiuntivo di dispositivo.
    2011-11-10 17: 16: 24Z
  5. Potrei controllare l'IP del socket sul lato server, ma ho pensato che sarebbe stato più bello se il dispositivo (client) indica al server quale IP si aspetta altri dispositivi per connettersi.
    2011-11-10 17: 17: 41Z
9 risposte                              9                         

La NetworkInterface classe contiene tutti i metodi pertinenti, ma attenzione che non esiste un "mio IP". Una macchina può avere più interfacce e ogni interfaccia può avere più IP.

Puoi elencarli tutti con questa classe, ma l'interfaccia e l'IP che scegli dall'elenco dipendono da cosa hai esattamente bisogno di usare questo IP.

(InetAddress.getLocalHost() non consulta le tue interfacce, restituisce semplicemente costante 127.0.0.1 (per IPv4))

    
18
2011-11-10 17: 24: 21Z
 
    String ip;
    try {
        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
        while (interfaces.hasMoreElements()) {
            NetworkInterface iface = interfaces.nextElement();
            // filters out 127.0.0.1 and inactive interfaces
            if (iface.isLoopback() || !iface.isUp())
                continue;

            Enumeration<InetAddress> addresses = iface.getInetAddresses();
            while(addresses.hasMoreElements()) {
                InetAddress addr = addresses.nextElement();
                ip = addr.getHostAddress();
                System.out.println(iface.getDisplayName() + " " + ip);
            }
        }
    } catch (SocketException e) {
        throw new RuntimeException(e);
    }
    
38
2013-01-21 16: 52: 55Z

Chiediamo a AWS

 
URL url = new URL("http://checkip.amazonaws.com/");
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
System.out.println(br.readLine());

Modifica

Prima del downvote, sono consapevole che questa non è una soluzione java. È una soluzione generale per qualsiasi linguaggio di programmazione. Le altre soluzioni non funzionano altrettanto bene per me. Inoltre, credo che il modo più semplice per conoscere il tuo IP sia quello di andare su Internet. Può essere qualsiasi sito, il server può restituire l'ip del client che ha ottenuto nella richiesta. Puoi impostare il tuo endpoint per questo.

    
9
2017-10-21 08: 09: 38Z
  1. Questo recupererà l'indirizzo IP WAN e nella maggior parte dei casi è un indirizzo diverso dall'IP LAN, che è wLa domanda è circa.
    2018-03-12 09: 05: 47Z

Avuto lo stesso problema, ho trovato la soluzione su questa pagina: http://mrhawy.blogspot.it/2012/05/how-to-get-your-external-ip-ad-ress-in.html

 
    public String getIpAddress() throws MalformedURLException, IOException {
  URL myIP = new URL("http://api.externalip.net/ip/");
  BufferedReader in = new BufferedReader(
                       new InputStreamReader(myIP.openStream())
                      );
  return in.readLine();
  }

ha avuto alcuni problemi con questo codice a lungo termine, più volte in una settimana il server non risponderà.

nuova soluzione:

 
public static String getIpAddress() 
{ 
        URL myIP;
        try {
            myIP = new URL("http://api.externalip.net/ip/");

            BufferedReader in = new BufferedReader(
                    new InputStreamReader(myIP.openStream())
                    );
            return in.readLine();
        } catch (Exception e) 
        {
            try 
            {
                myIP = new URL("http://myip.dnsomatic.com/");

                BufferedReader in = new BufferedReader(
                        new InputStreamReader(myIP.openStream())
                        );
                return in.readLine();
            } catch (Exception e1) 
            {
                try {
                    myIP = new URL("http://icanhazip.com/");

                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(myIP.openStream())
                            );
                    return in.readLine();
                } catch (Exception e2) {
                    e2.printStackTrace(); 
                }
            }
        }

    return null;
}
    
3
2013-07-19 10: 59: 35Z

Un'altra opzione per l'interfaccia di rete predefinita, stavo solo provando 5 minuti fa e ho visto la tua domanda:)

 
InetAddress[] localaddr;

try {
    localaddr = InetAddress.getAllByName("host.name");

    for(int i = 0; i < localaddr.length; i++){
        System.out.println("\n" + localaddr[i].getHostAddress());
    }
} catch (UnknownHostException e) {
    e.printStackTrace();
}
    
3
2017-05-11 12: 02: 08Z
 
//This program is find your exact LAN(Local Machine on which your are       //runing this program) IP Address 
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

public class GetMyIPAddress {
public static void main(String gks[]) throws SocketException{
    Enumeration e = NetworkInterface.getNetworkInterfaces();
    int ctr=0;
    while(e.hasMoreElements())
    {
        NetworkInterface n = (NetworkInterface) e.nextElement();
        Enumeration ee = n.getInetAddresses();
        while (ee.hasMoreElements() && ctr<3)
        {       ctr++;
            if(ctr==3)
                break;
                InetAddress i = (InetAddress) ee.nextElement();
                    if(ctr==2)
                         System.out.println(i.getHostAddress());

        }
    }
}

}
    
2
2015-02-12 12: 08: 10Z

La mia soluzione che restituisce solo 1 indirizzo IP4:

 
try {
    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
    while (interfaces.hasMoreElements()) {
        NetworkInterface iface = interfaces.nextElement();
        if (iface.isLoopback() || !iface.isUp() || iface.isVirtual() || iface.isPointToPoint())
            continue;

        Enumeration<InetAddress> addresses = iface.getInetAddresses();
        while(addresses.hasMoreElements()) {
            InetAddress addr = addresses.nextElement();

            final String ip = addr.getHostAddress();
            if(Inet4Address.class == addr.getClass()) return ip;
        }
    }
} catch (SocketException e) {
    throw new RuntimeException(e);
}
return null;
    
2
2016-03-23 ​​20: 23: 06Z

Ecco il mio approccio per ottenere l'indirizzo IP.

  1. Ottieni il tuo indirizzo gateway predefinito
  2. Ottieni tutti gli indirizzi sul tuo PC
  3. Ora nel tuo IP (supponiamo 192.168.100.4) e l'IP del gateway predefinito (supponiamo che 192.168.100.1) abbiano le prime 9 cifre dell'indirizzo devono essere uguali, quindi qualsiasi IP che soddisfa questo criterio è il tuo IP.

Vedi sotto per codice completo funzionante.

 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.TreeSet;

public class MyIpAddress {

    public static void main(String[] args) {
        // doPortForwarding();

        MyIpAddress myIpAddress = new MyIpAddress();

        // get default address
        String yourIp = myIpAddress.getYourIp(myIpAddress
                .getDefaultGateWayAddress());
        System.out.println(yourIp);

        // get

    } // amin

    // return ip address for which u need to do port forwarding
    private String getYourIp(String defaultAddress) {

        String temp = defaultAddress.substring(0, 11);
        String ipToForward = "";

        TreeSet<String> ipAddrs = getIpAddressList();
        for (Iterator<String> iterator = ipAddrs.iterator(); iterator.hasNext();) {

            String tempIp = iterator.next();
            if (tempIp.contains(temp)) {
                ipToForward = tempIp;
                break;
            }
        }

        return ipToForward;

    }// ipForPortForwarding

    // get the ipaddress list
    private TreeSet<String> getIpAddressList() {
        TreeSet<String> ipAddrs = new TreeSet<String>();

        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface
                    .getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface iface = interfaces.nextElement();
                // filters out 127.0.0.1 and inactive interfaces
                if (iface.isLoopback() || !iface.isUp())
                    continue;

                Enumeration<InetAddress> addresses = iface.getInetAddresses();
                while (addresses.hasMoreElements()) {

                    InetAddress addr = addresses.nextElement();

                    ipAddrs.add(addr.getHostAddress());

                }// 2 nd while
            }// 1 st while
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return ipAddrs;

    }// getIpAddressList

    // get default gateway address in java

    private String getDefaultGateWayAddress() {
        String defaultAddress = "";
        try {
            Process result = Runtime.getRuntime().exec("netstat -rn");

            BufferedReader output = new BufferedReader(new InputStreamReader(
                    result.getInputStream()));

            String line = output.readLine();
            while (line != null) {
                if (line.contains("0.0.0.0")) {

                    StringTokenizer stringTokenizer = new StringTokenizer(line);
                    stringTokenizer.nextElement();// first string is 0.0.0.0
                    stringTokenizer.nextElement();// second string is 0.0.0.0
                    defaultAddress = (String) stringTokenizer.nextElement(); // this is our default address
                    break;
                }

                line = output.readLine();

            }// while
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return defaultAddress;

    }// getDefaultAddress
}
    
2
2017-01-20 10: 25: 15Z

Devi ottenere il barattolo di jsoup qui aggiungi il jar di jsoup nel tuo progetto java e interpreta queste righe di codice e otterrai il tuo indirizzo IP,

 
Document doc = Jsoup.connect("https://whatismyipaddress.com/").timeout(10000).get() ;
Elements el = doc.select("div#section_left") ;
Element e = el.select("a").get(
System.out.println(e.text());
    
0
2018-06-16 13: 28: 26Z
fonte posta Qui
Altre domande