Ottenere l'indirizzo IP della macchina corrente usando Java


291

Sto cercando di sviluppare un sistema in cui vi sono nodi diversi che vengono eseguiti su sistemi diversi o su porte diverse sullo stesso sistema.

Ora tutti i nodi creano un socket con un IP di destinazione come IP di un nodo speciale noto come nodo di bootstrap. I nodi quindi creano i propriServerSocket e iniziano ad ascoltare le connessioni.

Il nodo di bootstrap mantiene un elenco di nodi e li restituisce al momento della query.

Ora quello che mi serve è che il nodo deve registrare il suo IP sul nodo di bootstrap. Ho provato a utilizzare cli.getInetAddress()una volta che il client si connette al ServerSocketnodo di bootstrap ma che non ha funzionato.

  1. Ho bisogno che il client registri il suo IP PPP se disponibile;
  2. Altrimenti l'IP LAN se disponibile;
  3. Altrimenti deve registrare 127.0.0.1 assumendo che sia lo stesso computer.

Utilizzando il codice:

System.out.println(Inet4Address.getLocalHost().getHostAddress());

o

System.out.println(InetAddress.getLocalHost().getHostAddress());

Il mio indirizzo IP di connessione PPP è: 117.204.44.192 ma quanto sopra mi restituisce 192.168.1.2

MODIFICARE

Sto usando il seguente codice:

Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
    NetworkInterface n = (NetworkInterface) e.nextElement();
    Enumeration ee = n.getInetAddresses();
    while (ee.hasMoreElements())
    {
        InetAddress i = (InetAddress) ee.nextElement();
        System.out.println(i.getHostAddress());
    }
}

Sono in grado di ottenere tutti gli indirizzi IP associati a tutti gli NetworkInterfaces, ma come li distinguo? Questo è l'output che sto ottenendo:

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19

Inet4Address.getLocalHost () dovrebbe funzionare correttamente?
Sears India,

3
All'interno del ciclo se aggiungo n.isPointToPoint () funzionerà ?? La mia idea è di restituire "127.0.0.1" se non viene trovata alcuna rete Point to Point. Funzionerà??
sasidhar,

3
@sasidhar: non pubblicare il tuo indirizzo IP originale. scrivi 117.xxx.xxx.xxx, per l'IP privato va bene.
nIcO circa

@GagandeepBali Grazie per il consiglio ma il mio IP è un IP dinamico e ottengo un nuovo IP ogni volta che mi disconnetto e mi connetto a Internet. Quindi non dovrebbe essere un problema, immagino.
sasidhar,

Risposte:


115
import java.net.DatagramSocket;
import java.net.InetAddress;

try(final DatagramSocket socket = new DatagramSocket()){
  socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
  ip = socket.getLocalAddress().getHostAddress();
}

In questo modo funziona bene quando ci sono più interfacce di rete. Restituisce sempre l'IP in uscita preferito. La destinazione 8.8.8.8non è necessaria per essere raggiungibile.

Connectsu un socket UDP ha il seguente effetto: imposta la destinazione per Send / Recv, scarta tutti i pacchetti da altri indirizzi e - che è quello che usiamo - trasferisce il socket nello stato "connesso", imposta i campi appropriati. Ciò include la verifica dell'esistenza del percorso verso la destinazione in base alla tabella di routing del sistema e l'impostazione dell'endpoint locale di conseguenza. L'ultima parte sembra non essere ufficialmente documentata ma sembra un tratto integrale dell'API socket Berkeley (un effetto collaterale dello stato "connesso" UDP) che funziona in modo affidabile sia su Windows che su Linux attraverso versioni e distribuzioni.

Quindi, questo metodo fornirà l'indirizzo locale che verrebbe utilizzato per connettersi all'host remoto specificato. Non è stata stabilita alcuna connessione reale, quindi l'ip remoto specificato può essere irraggiungibile.

Modificare:

Come dice @macomgil , per MacOS puoi farlo:

Socket socket = new Socket();
socket.connect(new InetSocketAddress("google.com", 80));
System.out.println(socket.getLocalAddress());

7
Ha funzionato per me su Linux ma su OsX ottengo: "0.0.0.0"
Radu Toader

@Jeef, la risposta è aggiornata. Se non funziona su OsX, allora devi scegliere un altro modo.
Mr.Wang di Next Door,

1
Brillante! Cordiali saluti, quando si tratta di una rete interna chiusa, basta sostituire l'8.8.8.8 con qualcosa che ogni host possa raggiungere
Murphy Ng

Funziona su Windows; possiamo confermare se OSX è ancora un problema?
trilogia,

4
@trilogy Sto ancora ricevendo 0.0.0.0 su OSX
Peter Tutervai il

273

Questo potrebbe essere un po 'complicato nel caso più generale.

A prima vista, InetAddress.getLocalHost()dovrebbe darti l'indirizzo IP di questo host. Il problema è che un host potrebbe avere molte interfacce di rete e un'interfaccia potrebbe essere associata a più di un indirizzo IP. E per di più, non tutti gli indirizzi IP saranno raggiungibili al di fuori della macchina o della LAN. Ad esempio, potrebbero essere indirizzi IP per dispositivi di rete virtuali, indirizzi IP di rete privata e così via.

Ciò significa che l'indirizzo IP restituito InetAddress.getLocalHost()potrebbe non essere quello giusto da utilizzare.

Come puoi gestirlo?

  • Un approccio consiste nell'utilizzare NetworkInterface.getNetworkInterfaces()per ottenere tutte le interfacce di rete note sull'host e quindi scorrere gli indirizzi di ciascuna NI.
  • Un altro approccio è (in qualche modo) ottenere l'FQDN pubblicizzato esternamente per l'host e utilizzarlo InetAddress.getByName() per cercare l'indirizzo IP primario. (Ma come lo ottieni e come gestisci un bilanciamento del carico basato su DNS?)
  • Una variante della precedente è quella di ottenere l'FQDN preferito da un file di configurazione o da un parametro della riga di comando.
  • Un'altra variante è quella di ottenere l'indirizzo IP preferito da un file di configurazione o da un parametro della riga di comando.

In breve, InetAddress.getLocalHost()funzionerà in genere, ma potrebbe essere necessario fornire un metodo alternativo per i casi in cui il codice viene eseguito in un ambiente con reti "complicate".


Sono in grado di ottenere tutti gli indirizzi IP associati a tutte le interfacce di rete, ma come posso distinguerli?

  • Qualsiasi indirizzo nell'intervallo 127.xxx.xxx.xxx è un indirizzo "loopback". È visibile solo a "questo" host.
  • Qualsiasi indirizzo nell'intervallo 192.168.xxx.xxx è un indirizzo IP privato (noto anche come sito locale). Questi sono riservati per l'uso all'interno di un'organizzazione. Lo stesso vale per gli indirizzi 10.xxx.xxx.xxx e da 172.16.xxx.xxx a 172.31.xxx.xxx.
  • Gli indirizzi nell'intervallo 169.254.xxx.xxx sono indirizzi IP locali di collegamento. Questi sono riservati per l'uso su un singolo segmento di rete.
  • Gli indirizzi nell'intervallo da 224.xxx.xxx.xxx a 239.xxx.xxx.xxx sono indirizzi multicast.
  • L'indirizzo 255.255.255.255 è l'indirizzo di trasmissione.
  • Qualsiasi altra cosa dovrebbe essere un indirizzo IPv4 point-to-point pubblico valido.

In effetti, l'API InetAddress fornisce metodi per testare indirizzi di loopback, link local, site local, multicast e broadcast. Puoi usarli per ordinare quale degli indirizzi IP che ottieni è più appropriato.


3
Nel caso in cui qualcuno sia curioso, getLocalHost esegue essenzialmente una ricerca DNS sul nome host del server. Se ottiene un indirizzo IP da quella ricerca, cerca tra le interfacce disponibili per vedere quale interfaccia ha quell'indirizzo IP e restituisce quell'interfaccia. Ciò significa che getLocalHost tenderà a funzionare in un ambiente "server" in cui l'IP in uscita è quello associato al nome host del server.
Pace,

1
Su Ubuntu 14.04 questo API restituisce 127.0.1.1 anche se ifconfig riporta solo due interfacce, quella che desidero (l'indirizzo IP accessibile pubblicamente) e il loopback (127.0.0.1). Strano che restituisca un alias di loopback diverso.
ctpenrose,

Aggiungerò che se use getLocalHost().getHostAddress()pubblichi qualcosa, potresti vedere 0.0.0.0guardando da un altro computer sulla rete. Questo è spiegato qui Questo è quello che mi è successo mentre stavo usando Gazebo su due computer
Peter Mitrano,

57

La pubblicazione qui ha verificato il codice di soluzione alternativa all'ambiguità IP da https://issues.apache.org/jira/browse/JCS-40 (InetAddress.getLocalHost () ambiguo su sistemi Linux):

/**
 * Returns an <code>InetAddress</code> object encapsulating what is most likely the machine's LAN IP address.
 * <p/>
 * This method is intended for use as a replacement of JDK method <code>InetAddress.getLocalHost</code>, because
 * that method is ambiguous on Linux systems. Linux systems enumerate the loopback network interface the same
 * way as regular LAN network interfaces, but the JDK <code>InetAddress.getLocalHost</code> method does not
 * specify the algorithm used to select the address returned under such circumstances, and will often return the
 * loopback address, which is not valid for network communication. Details
 * <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4665037">here</a>.
 * <p/>
 * This method will scan all IP addresses on all network interfaces on the host machine to determine the IP address
 * most likely to be the machine's LAN address. If the machine has multiple IP addresses, this method will prefer
 * a site-local IP address (e.g. 192.168.x.x or 10.10.x.x, usually IPv4) if the machine has one (and will return the
 * first site-local address if the machine has more than one), but if the machine does not hold a site-local
 * address, this method will return simply the first non-loopback address found (IPv4 or IPv6).
 * <p/>
 * If this method cannot find a non-loopback address using this selection algorithm, it will fall back to
 * calling and returning the result of JDK method <code>InetAddress.getLocalHost</code>.
 * <p/>
 *
 * @throws UnknownHostException If the LAN address of the machine cannot be found.
 */
private static InetAddress getLocalHostLANAddress() throws UnknownHostException {
    try {
        InetAddress candidateAddress = null;
        // Iterate all NICs (network interface cards)...
        for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements();) {
            NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
            // Iterate all IP addresses assigned to each card...
            for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements();) {
                InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
                if (!inetAddr.isLoopbackAddress()) {

                    if (inetAddr.isSiteLocalAddress()) {
                        // Found non-loopback site-local address. Return it immediately...
                        return inetAddr;
                    }
                    else if (candidateAddress == null) {
                        // Found non-loopback address, but not necessarily site-local.
                        // Store it as a candidate to be returned if site-local address is not subsequently found...
                        candidateAddress = inetAddr;
                        // Note that we don't repeatedly assign non-loopback non-site-local addresses as candidates,
                        // only the first. For subsequent iterations, candidate will be non-null.
                    }
                }
            }
        }
        if (candidateAddress != null) {
            // We did not find a site-local address, but we found some other non-loopback address.
            // Server might have a non-site-local address assigned to its NIC (or it might be running
            // IPv6 which deprecates the "site-local" concept).
            // Return this non-loopback candidate address...
            return candidateAddress;
        }
        // At this point, we did not find a non-loopback address.
        // Fall back to returning whatever InetAddress.getLocalHost() returns...
        InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
        if (jdkSuppliedAddress == null) {
            throw new UnknownHostException("The JDK InetAddress.getLocalHost() method unexpectedly returned null.");
        }
        return jdkSuppliedAddress;
    }
    catch (Exception e) {
        UnknownHostException unknownHostException = new UnknownHostException("Failed to determine LAN address: " + e);
        unknownHostException.initCause(e);
        throw unknownHostException;
    }
}

6
Va notato che questo non risolve ancora l'ambuguità nel caso in cui l'host abbia più interfacce di nerwork simili.
Vadzim,

1
la risposta qui sotto è migliore - stackoverflow.com/questions/9481865/… ottiene l'indirizzo IP locale che viene utilizzato come src per Default Gatway
Radu Toader,

Perché l'indirizzo IP viene aggiunto con la barra frontale ..? come /10.39.0.17 ..?, È sempre così che dovrebbe essere tagliato ..?
Kanagavelu Sugumar,

51

A questo scopo è possibile utilizzare la classe InetAddress di java .

InetAddress IP=InetAddress.getLocalHost();
System.out.println("IP of my system is := "+IP.getHostAddress());

Uscita per il mio sistema = IP of my system is := 10.100.98.228

ritorna getHostAddress ()

Restituisce la stringa dell'indirizzo IP nella presentazione testuale.

O puoi anche fare

InetAddress IP=InetAddress.getLocalHost();
System.out.println(IP.toString());

Uscita = IP of my system is := RanRag-PC/10.100.98.228


9
Si noti che 10.xxx è un indirizzo privato, a indicare che il sistema si trova su una rete NAT. Apparirà come un indirizzo diverso quando si contatta il mondo esterno. Se hai davvero bisogno dell'indirizzo IP esterno, dovrai contattare uno dei tanti siti che ti restituiranno l'indirizzo IP da cui provieni. Questo può o non può esserti utile. Il tuo sistema quasi sicuramente non sarà raggiungibile dall'esterno in nessun caso.
Edward Falk,

19

Quando stai cercando il tuo indirizzo "locale", dovresti notare che ogni macchina non ha solo una singola interfaccia di rete e ogni interfaccia potrebbe avere il suo indirizzo locale. Ciò significa che la tua macchina possiede sempre diversi indirizzi "locali".

Verranno automaticamente scelti diversi indirizzi "locali" da utilizzare quando ci si connette a endpoint diversi. Ad esempio, quando ti connetti google.com, stai utilizzando un indirizzo locale "esterno"; ma quando ti connetti al tuo localhost, il tuo indirizzo locale è sempre localhostse stesso, perché localhost è solo un loopback.

Di seguito viene mostrato come scoprire il tuo indirizzo locale durante la comunicazione con google.com:

Socket socket = new Socket();
socket.connect(new InetSocketAddress("google.com", 80));
System.out.println(socket.getLocalAddress());

Eccezionale !! - Così facile :)
smilyface,

4
aggiungi socket.close () alla fine :)
MC,

11

Esempio in scala (utile nel file sbt):

  import collection.JavaConverters._
  import java.net._

  def getIpAddress: String = {

    val enumeration = NetworkInterface.getNetworkInterfaces.asScala.toSeq

    val ipAddresses = enumeration.flatMap(p =>
      p.getInetAddresses.asScala.toSeq
    )

    val address = ipAddresses.find { address =>
      val host = address.getHostAddress
      host.contains(".") && !address.isLoopbackAddress
    }.getOrElse(InetAddress.getLocalHost)

    address.getHostAddress
  }

10

EDIT 1: il codice aggiornato, dal collegamento precedente, non esiste più

import java.io.*;
import java.net.*;

public class GetMyIP {
    public static void main(String[] args) {
        URL url = null;
        BufferedReader in = null;
        String ipAddress = "";
        try {
            url = new URL("http://bot.whatismyipaddress.com");
            in = new BufferedReader(new InputStreamReader(url.openStream()));
            ipAddress = in.readLine().trim();
            /* IF not connected to internet, then
             * the above code will return one empty
             * String, we can check it's length and
             * if length is not greater than zero, 
             * then we can go for LAN IP or Local IP
             * or PRIVATE IP
             */
            if (!(ipAddress.length() > 0)) {
                try {
                    InetAddress ip = InetAddress.getLocalHost();
                    System.out.println((ip.getHostAddress()).trim());
                    ipAddress = (ip.getHostAddress()).trim();
                } catch(Exception exp) {
                    ipAddress = "ERROR";
                }
            }
        } catch (Exception ex) {
            // This try will give the Private IP of the Host.
            try {
                InetAddress ip = InetAddress.getLocalHost();
                System.out.println((ip.getHostAddress()).trim());
                ipAddress = (ip.getHostAddress()).trim();
            } catch(Exception exp) {
                ipAddress = "ERROR";
            }
            //ex.printStackTrace();
        }
        System.out.println("IP Address: " + ipAddress);
    }
}

VERSIONE ATTUALE: ha smesso di funzionare

Spero che questo frammento possa aiutarti a raggiungere questo obiettivo:

// Method to get the IP Address of the Host.
private String getIP()
{
    // This try will give the Public IP Address of the Host.
    try
    {
        URL url = new URL("http://automation.whatismyip.com/n09230945.asp");
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String ipAddress = new String();
        ipAddress = (in.readLine()).trim();
        /* IF not connected to internet, then
         * the above code will return one empty
         * String, we can check it's length and
         * if length is not greater than zero, 
         * then we can go for LAN IP or Local IP
         * or PRIVATE IP
         */
        if (!(ipAddress.length() > 0))
        {
            try
            {
                InetAddress ip = InetAddress.getLocalHost();
                System.out.println((ip.getHostAddress()).trim());
                return ((ip.getHostAddress()).trim());
            }
            catch(Exception ex)
            {
                return "ERROR";
            }
        }
        System.out.println("IP Address is : " + ipAddress);

        return (ipAddress);
    }
    catch(Exception e)
    {
        // This try will give the Private IP of the Host.
        try
        {
            InetAddress ip = InetAddress.getLocalHost();
            System.out.println((ip.getHostAddress()).trim());
            return ((ip.getHostAddress()).trim());
        }
        catch(Exception ex)
        {
            return "ERROR";
        }
    }
}

2
La soluzione funzionerebbe, si spera se sono sempre connesso a Internet, ma non ne sono sicuro. Inoltre, quando il sistema non è connesso a Internet e quindi devo restituire l'indirizzo IP LAN del sistema, se presente, altrimenti l'host locale. Quindi non è un'opzione fattibile per me. Qualsiasi altro modo??
sasidhar,

@sasidhar: quando sei connesso a Internet, solo allora avrai il tuo IP pubblico immagino, se non sei connesso, questo metodo ti fornirà il tuo IP locale o IP LAN e per l'ultima condizione come da te specificato puoi restituire "127.0.0.1", invece di restituire Error.
nIcO circa

1
Mi piace il tuo approccio ma quel link sembra non funzionare più !! Posso mettere un controller sul mio sistema per funzionare invece di quel link esterno e quindi essere più affidabile ???
Azerafati,

1
@Bludream: Grazie mille, per averlo appreso, che il link non funziona più. Ho aggiornato il post, con alcuni nuovi input. Spero che funzioni per il tuo utente. Per quanto riguarda la tua domanda, non so davvero come impostare un controller sul tuo sistema per farlo funzionare. Quindi non sarò in grado di dare un'idea di questo argomento, MY BAD. Grazie ancora e
CONTINUA A

1
Per quanto sia una soluzione interessante, è estremamente inaffidabile. Se dovessi bloccare il thread principale (diciamo) e per qualsiasi motivo whatismyip.comnon funzionasse per un certo periodo di tempo, anche la tua app sarebbe inattiva :(. Oppure restituirà dati spazzatura e causerà comportamenti imprevisti. Inoltre, questo restituisce l'esterno maggior parte dell'indirizzo IP rilevabile da whatismyip.com, non necessariamente l'indirizzo IP della macchina che stai utilizzando
Decodificato il

6

in primo luogo importare la classe

import java.net.InetAddress;

in classe

  InetAddress iAddress = InetAddress.getLocalHost();
  String currentIp = iAddress.getHostAddress();
  System.out.println("Current IP address : " +currentIp); //gives only host address

2
fornisce solo il primo indirizzo IP anche se non è quello in uso!
Yahya,

6

Puoi usare l' java.net.InetAddressAPI. Prova questo :

InetAddress.getLocalHost().getHostAddress();

5
restituirà solo 127.0.0.1
HCarrasko il

5
private static InetAddress getLocalAddress(){
        try {
            Enumeration<NetworkInterface> b = NetworkInterface.getNetworkInterfaces();
            while( b.hasMoreElements()){
                for ( InterfaceAddress f : b.nextElement().getInterfaceAddresses())
                    if ( f.getAddress().isSiteLocalAddress())
                        return f.getAddress();
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return null;
    }

1
per favore, considera di aggiungere qualche spiegazione su cosa fa il tuo codice.
HCarrasko,

4

Questo è un esempio funzionante della risposta ACCETTATA sopra! Questa classe NetIdentity memorizzerà sia l'ip host interno, sia il loopback locale. Se ti trovi su un server basato su DNS, come menzionato sopra, potrebbe essere necessario aggiungere altri controlli o è possibile passare al percorso del file di configurazione.

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

/**
 * Class that allows a device to identify itself on the INTRANET.
 * 
 * @author Decoded4620 2016
 */
public class NetIdentity {

    private String loopbackHost = "";
    private String host = "";

    private String loopbackIp = "";
    private String ip = "";
    public NetIdentity(){

        try{
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();

            while(interfaces.hasMoreElements()){
                NetworkInterface i = interfaces.nextElement();
                if(i != null){
                    Enumeration<InetAddress> addresses = i.getInetAddresses();
                    System.out.println(i.getDisplayName());
                    while(addresses.hasMoreElements()){
                        InetAddress address = addresses.nextElement();
                        String hostAddr = address.getHostAddress();

                        // local loopback
                        if(hostAddr.indexOf("127.") == 0 ){
                            this.loopbackIp = address.getHostAddress();
                            this.loopbackHost = address.getHostName();
                        }

                        // internal ip addresses (behind this router)
                        if( hostAddr.indexOf("192.168") == 0 || 
                                hostAddr.indexOf("10.") == 0 || 
                                hostAddr.indexOf("172.16") == 0 ){
                            this.host = address.getHostName();
                            this.ip = address.getHostAddress();
                        }


                        System.out.println("\t\t-" + address.getHostName() + ":" + address.getHostAddress() + " - "+ address.getAddress());
                    }
                }
            }
        }
        catch(SocketException e){

        }
        try{
            InetAddress loopbackIpAddress = InetAddress.getLocalHost();
            this.loopbackIp = loopbackIpAddress.getHostName();
            System.out.println("LOCALHOST: " + loopbackIp);
        }
        catch(UnknownHostException e){
            System.err.println("ERR: " + e.toString());
        }
    }

    public String getLoopbackHost(){
        return loopbackHost;
    }

    public String getHost(){
        return host;
    }
    public String getIp(){
        return ip;
    }
    public String getLoopbackIp(){
        return loopbackIp;
    }
}

Quando eseguo questo codice ottengo effettivamente una stampa in questo modo:

    Software Loopback Interface 1
        -127.0.0.1:127.0.0.1 - [B@19e1023e
        -0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:1 - [B@7cef4e59
Broadcom 802.11ac Network Adapter
        -VIKING.yourisp.com:192.168.1.142 - [B@64b8f8f4
        -fe80:0:0:0:81fa:31d:21c9:85cd%wlan0:fe80:0:0:0:81fa:31d:21c9:85cd%wlan0 - [B@2db0f6b2
Microsoft Kernel Debug Network Adapter
Intel Edison USB RNDIS Device
Driver for user-mode network applications
Cisco Systems VPN Adapter for 64-bit Windows
VirtualBox Host-Only Ethernet Adapter
        -VIKING:192.168.56.1 - [B@3cd1f1c8
        -VIKING:fe80:0:0:0:d599:3cf0:5462:cb7%eth4 - [B@3a4afd8d
LogMeIn Hamachi Virtual Ethernet Adapter
        -VIKING:25.113.118.39 - [B@1996cd68
        -VIKING:2620:9b:0:0:0:0:1971:7627 - [B@3339ad8e
        -VIKING:fe80:0:0:0:51bf:994d:4656:8486%eth5 - [B@555590
Bluetooth Device (Personal Area Network)
        -fe80:0:0:0:4c56:8009:2bca:e16b%eth6:fe80:0:0:0:4c56:8009:2bca:e16b%eth6 - [B@3c679bde
Bluetooth Device (RFCOMM Protocol TDI)
Intel(R) Ethernet Connection (2) I218-V
        -fe80:0:0:0:4093:d169:536c:7c7c%eth7:fe80:0:0:0:4093:d169:536c:7c7c%eth7 - [B@16b4a017
Microsoft Wi-Fi Direct Virtual Adapter
        -fe80:0:0:0:103e:cdf0:c0ac:1751%wlan1:fe80:0:0:0:103e:cdf0:c0ac:1751%wlan1 - [B@8807e25
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0000
VirtualBox Host-Only Ethernet Adapter-WFP Native MAC Layer LightWeight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0001
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0002
VirtualBox Host-Only Ethernet Adapter-VirtualBox NDIS Light-Weight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0003
VirtualBox Host-Only Ethernet Adapter-QoS Packet Scheduler-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0004
VirtualBox Host-Only Ethernet Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0000
Intel(R) Ethernet Connection (2) I218-V-WFP Native MAC Layer LightWeight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0001
Intel(R) Ethernet Connection (2) I218-V-Shrew Soft Lightweight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0002
Intel(R) Ethernet Connection (2) I218-V-VirtualBox NDIS Light-Weight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0003
Intel(R) Ethernet Connection (2) I218-V-QoS Packet Scheduler-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0004
Intel(R) Ethernet Connection (2) I218-V-WFP 802.3 MAC Layer LightWeight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0005
Broadcom 802.11ac Network Adapter-WFP Native MAC Layer LightWeight Filter-0000
Broadcom 802.11ac Network Adapter-Virtual WiFi Filter Driver-0000
Broadcom 802.11ac Network Adapter-Native WiFi Filter Driver-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0003
Broadcom 802.11ac Network Adapter-Shrew Soft Lightweight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0004
Broadcom 802.11ac Network Adapter-VirtualBox NDIS Light-Weight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Broadcom 802.11ac Network Adapter-QoS Packet Scheduler-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0006
Broadcom 802.11ac Network Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0007
Microsoft Wi-Fi Direct Virtual Adapter-WFP Native MAC Layer LightWeight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-Native WiFi Filter Driver-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0002
Microsoft Wi-Fi Direct Virtual Adapter-Shrew Soft Lightweight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0003
Microsoft Wi-Fi Direct Virtual Adapter-VirtualBox NDIS Light-Weight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0004
Microsoft Wi-Fi Direct Virtual Adapter-QoS Packet Scheduler-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Microsoft Wi-Fi Direct Virtual Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0006

Per il mio utilizzo sto configurando un server Upnp, mi ha aiutato a capire il "modello" che stavo cercando. Alcuni degli oggetti restituiti sono Schede Ethernet, Schede di rete, Schede di rete virtuale, Driver e Schede client VPN. Non tutto ha neanche un indirizzo. Quindi ti consigliamo di saltare oggetti dell'interfaccia che non lo fanno.

Puoi anche aggiungere questo al loop per la corrente NetworkInterface i

while(interfaces.hasMoreElements()){
    Enumeration<InetAddress> addresses = i.getInetAddresses();
    System.out.println(i.getDisplayName());
    System.out.println("\t- name:" + i.getName());
    System.out.println("\t- idx:" + i.getIndex());
    System.out.println("\t- max trans unit (MTU):" + i.getMTU());
    System.out.println("\t- is loopback:" + i.isLoopback());
    System.out.println("\t- is PPP:" + i.isPointToPoint());
    System.out.println("\t- isUp:" + i.isUp());
    System.out.println("\t- isVirtual:" + i.isVirtual());
    System.out.println("\t- supportsMulticast:" + i.supportsMulticast());
}

E vedrai le informazioni nell'output in questo modo:

Software Loopback Interface 1
    - name:lo
    - idx:1
    - max trans unit (MTU):-1
    - is loopback:true
    - is PPP:false
    - isUp:true
    - isVirtual:false
    - supportsMulticast:true
        -ADRESS: [127.0.0.1(VIKING-192.168.56.1)]127.0.0.1:127.0.0.1 - [B@19e1023e
        -ADRESS: [0:0:0:0:0:0:0:1(VIKING-192.168.56.1)]0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:1 - [B@7cef4e59
Broadcom 802.11ac Network Adapter
    - name:wlan0
    - idx:2
    - max trans unit (MTU):1500
    - is loopback:false
    - is PPP:false
    - isUp:true
    - isVirtual:false
    - supportsMulticast:true
        -ADRESS: [VIKING.monkeybrains.net(VIKING-192.168.56.1)]VIKING.monkeybrains.net:192.168.1.142 - [B@64b8f8f4
        -ADRESS: [fe80:0:0:0:81fa:31d:21c9:85cd%wlan0(VIKING-192.168.56.1)]fe80:0:0:0:81fa:31d:21c9:85cd%wlan0:fe80:0:0:0:81fa:31d:21c9:85cd%wlan0 - [B@2db0f6b2
Microsoft Kernel Debug Network Adapter
    - name:eth0
    - idx:3
    - max trans unit (MTU):-1
    - is loopback:false
    - is PPP:false
    - isUp:false
    - isVirtual:false
    - supportsMulticast:true

3

Utilizzare InetAddress.getLocalHost () per ottenere l'indirizzo locale

import java.net.InetAddress;

try {
  InetAddress addr = InetAddress.getLocalHost();            
  System.out.println(addr.getHostAddress());
} catch (UnknownHostException e) {
}

Il mio indirizzo IP di connessione PPP è: 117.204.44.192 Ma quanto sopra mi restituisce 192.168.1.2
sasidhar,

Devi scansionare tutte le istanze di InetAddress disponibili e capire qual è quella corretta.
Decodificato il

1
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

public class IpAddress {

NetworkInterface ifcfg;
Enumeration<InetAddress> addresses;
String address;

public String getIpAddress(String host) {
    try {
        ifcfg = NetworkInterface.getByName(host);
        addresses = ifcfg.getInetAddresses();
        while (addresses.hasMoreElements()) {
            address = addresses.nextElement().toString();
            address = address.replace("/", "");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ifcfg.toString();
}
}

1

Un approccio piuttosto semplicistico che sembra funzionare ...

String getPublicIPv4() throws UnknownHostException, SocketException{
    Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
    String ipToReturn = null;
    while(e.hasMoreElements())
    {
        NetworkInterface n = (NetworkInterface) e.nextElement();
        Enumeration<InetAddress> ee = n.getInetAddresses();
        while (ee.hasMoreElements())
        {
            InetAddress i = (InetAddress) ee.nextElement();
            String currentAddress = i.getHostAddress();
            logger.trace("IP address "+currentAddress+ " found");
            if(!i.isSiteLocalAddress()&&!i.isLoopbackAddress() && validate(currentAddress)){
                ipToReturn = currentAddress;    
            }else{
                System.out.println("Address not validated as public IPv4");
            }

        }
    }

    return ipToReturn;
}

private static final Pattern IPv4RegexPattern = Pattern.compile(
        "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");

public static boolean validate(final String ip) {
    return IPv4RegexPattern.matcher(ip).matches();
}

1

Questo ottiene l'indirizzo IP della tua rete se la tua macchina fa parte di una rete

try {
    System.out.println(InetAddress.getLocalHost().getHostAddress());
} catch (UnknownHostException e) {
    e.printStackTrace();
}

0

Di solito quando provo a trovare il mio indirizzo IP pubblico come cmyip.com o www.iplocation.net , utilizzo in questo modo:

public static String myPublicIp() {

    /*nslookup myip.opendns.com resolver1.opendns.com*/
    String ipAdressDns  = "";
    try {
        String command = "nslookup myip.opendns.com resolver1.opendns.com";
        Process proc = Runtime.getRuntime().exec(command);

        BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));

        String s;
        while ((s = stdInput.readLine()) != null) {
            ipAdressDns  += s + "\n";
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return ipAdressDns ;
}

0

Dal momento che il mio sistema (come tanti altri sistemi) aveva varie interfacce di rete. InetAddress.getLocalHost()o Inet4Address.getLocalHost()semplicemente restituito uno che non desideravo. Pertanto ho dovuto usare questo approccio ingenuo.

InetAddress[] allAddresses = Inet4Address.getAllByName("YourComputerHostName");
        InetAddress desiredAddress;
        //In order to find the desired Ip to be routed by other modules (WiFi adapter)
        for (InetAddress address :
                allAddresses) {
            if (address.getHostAddress().startsWith("192.168.2")) {
                desiredAddress = address;
            }
        }
// Use the desired address for whatever purpose.

Stai solo attento che in questo approccio sapevo già che il mio indirizzo IP desiderato era in 192.168.2sottorete.


-1
public static String getIpAddress() {

    String ipAddress = null;

    try {
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();

        while (networkInterfaces.hasMoreElements()) {

            NetworkInterface networkInterface = networkInterfaces.nextElement();

            byte[] hardwareAddress = networkInterface.getHardwareAddress();
            if (null == hardwareAddress || 0 == hardwareAddress.length || (0 == hardwareAddress[0] && 0 == hardwareAddress[1] && 0 == hardwareAddress[2])) continue;

            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();

            if (inetAddresses.hasMoreElements()) ipAddress = inetAddresses.nextElement().toString();

            break;
        }
    } catch (SocketException e) {
        e.printStackTrace();
    }

    return ipAddress;
}

per favore, aggiungi qualche spiegazione su cosa fa il tuo codice.
HCarrasko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.