Obtener la dirección IP de la máquina actual usando Java


291

Estoy tratando de desarrollar un sistema donde haya diferentes nodos que se ejecuten en un sistema diferente o en diferentes puertos en el mismo sistema.

Ahora todos los nodos crean un Socket con una IP de destino como la IP de un nodo especial conocido como nodo de arranque. Luego, los nodos crean los suyos ServerSockety comienzan a escuchar las conexiones.

El nodo de arranque mantiene una lista de nodos y los devuelve al ser consultados.

Ahora lo que necesito es que el nodo debe registrar su IP en el nodo de arranque. Intenté usar cli.getInetAddress()una vez que el cliente se conecta al ServerSocketnodo de arranque, pero eso no funcionó.

  1. Necesito que el cliente registre su IP PPP si está disponible;
  2. De lo contrario, la LAN IP si está disponible;
  3. De lo contrario, debe registrar 127.0.0.1 suponiendo que es la misma computadora.

Usando el código:

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

o

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

Mi dirección IP de conexión PPP es: 117.204.44.192 pero lo anterior me devuelve 192.168.1.2

EDITAR

Estoy usando el siguiente código:

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

Puedo obtener todas las direcciones IP asociadas a todos los correos electrónicos NetworkInterface, pero ¿cómo los distingo? Este es el resultado que estoy obteniendo:

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19

Inet4Address.getLocalHost () debería funcionar bien?
Sears India

3
Dentro del bucle si agrego n.isPointToPoint () ¿funcionará eso? Mi idea es devolver "127.0.0.1" si no se encuentra una red punto a punto. ¿¿Eso funcionará??
sasidhar

3
@sasidhar: No publique su dirección IP genuina. escriba 117.xxx.xxx.xxx, para IP privada está bien.
NOCHE VACA

@GagandeepBali Gracias por el consejo, pero mi IP es una IP dinámica y obtengo una nueva IP cada vez que me desconecto y conecto mi internet. Entonces no debería ser un problema, supongo.
sasidhar

Respuestas:


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

De esta manera funciona bien cuando hay múltiples interfaces de red. Siempre devuelve la IP saliente preferida. El destino 8.8.8.8no es necesario para ser accesible.

Connecten un socket UDP tiene el siguiente efecto: establece el destino para Send / Recv, descarta todos los paquetes de otras direcciones y, que es lo que usamos, transfiere el socket al estado "conectado", configura sus campos apropiados. Esto incluye verificar la existencia de la ruta hacia el destino de acuerdo con la tabla de enrutamiento del sistema y establecer el punto final local en consecuencia. La última parte parece no estar documentada oficialmente, pero parece un rasgo integral de la API de sockets de Berkeley (un efecto secundario del estado UDP "conectado") que funciona de manera confiable tanto en Windows como en Linux en todas las versiones y distribuciones.

Por lo tanto, este método proporcionará la dirección local que se usaría para conectarse al host remoto especificado. No hay una conexión real establecida, por lo tanto, la IP remota especificada puede ser inalcanzable.

Editar:

Como dice @macomgil , para MacOS puedes hacer esto:

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

77
Funcionó para mí en Linux pero en OsX obtengo: "0.0.0.0"
Radu Toader

@Jeef, la respuesta se actualiza. Si no funciona en OsX, entonces debe elegir otra forma.
Mr.Wang de Next Door

1
¡Brillante! Para su información, cuando se trata de una red interna cerrada, simplemente reemplace 8.8.8.8 con algo que cada host puede alcanzar
Murphy Ng

Funciona en Windows ¿podemos confirmar si OSX sigue siendo un problema?
trilogía

44
@trilogy Todavía obtengo 0.0.0.0 en OSX
Peter Tutervai

273

Esto podría ser un poco complicado en el caso más general.

A primera vista, InetAddress.getLocalHost()debería darle la dirección IP de este host. El problema es que un host podría tener muchas interfaces de red, y una interfaz podría estar vinculada a más de una dirección IP. Y para colmo, no todas las direcciones IP serán accesibles fuera de su máquina o su LAN. Por ejemplo, podrían ser direcciones IP para dispositivos de red virtual, direcciones IP de red privada, etc.

Lo que esto significa es que la dirección IP devuelta por InetAddress.getLocalHost()podría no ser la correcta.

¿Cómo puedes lidiar con esto?

  • Un enfoque es utilizar NetworkInterface.getNetworkInterfaces()para obtener todas las interfaces de red conocidas en el host y luego iterar sobre las direcciones de cada NI.
  • Otro enfoque es (de alguna manera) obtener el FQDN anunciado externamente para el host, y utilizarlo InetAddress.getByName()para buscar la dirección IP principal. (¿Pero cómo lo obtiene y cómo maneja un equilibrador de carga basado en DNS?)
  • Una variación de lo anterior es obtener el FQDN preferido de un archivo de configuración o un parámetro de línea de comando.
  • Otra variación es obtener la dirección IP preferida de un archivo de configuración o un parámetro de línea de comando.

En resumen, InetAddress.getLocalHost()normalmente funcionará, pero es posible que deba proporcionar un método alternativo para los casos en que su código se ejecuta en un entorno con redes "complicadas".


Puedo obtener todas las direcciones IP asociadas a todas las interfaces de red, pero ¿cómo las distingo?

  • Cualquier dirección en el rango 127.xxx.xxx.xxx es una dirección de "bucle invertido". Solo es visible para "este" host.
  • Cualquier dirección en el rango 192.168.xxx.xxx es una dirección IP privada (también conocida como sitio local). Estos están reservados para su uso dentro de una organización. Lo mismo se aplica a las direcciones 10.xxx.xxx.xxx y 172.16.xxx.xxx a 172.31.xxx.xxx.
  • Las direcciones en el rango 169.254.xxx.xxx son direcciones IP locales de enlace. Estos están reservados para su uso en un solo segmento de red.
  • Las direcciones en el rango 224.xxx.xxx.xxx a 239.xxx.xxx.xxx son direcciones de multidifusión.
  • La dirección 255.255.255.255 es la dirección de difusión.
  • Cualquier otra cosa debe ser una dirección IPv4 pública de punto a punto válida.

De hecho, la API InetAddress proporciona métodos para realizar pruebas de bucle invertido, enlace local, sitio local, multidifusión y direcciones de difusión. Puede usarlos para clasificar cuál de las direcciones IP que obtiene es la más adecuada.


3
En caso de que alguien tenga curiosidad, getLocalHost básicamente realiza una búsqueda de DNS en el nombre de host del servidor. Si obtiene una dirección IP de esa búsqueda, busca a través de las interfaces disponibles para ver qué interfaz tiene esa dirección IP y devuelve esa interfaz. Esto significa que getLocalHost tenderá a funcionar en un entorno de "servidor" donde la IP saliente es la que se asigna al nombre de host del servidor.
Pace

1
En Ubuntu 14.04, esta API devuelve 127.0.1.1 aunque ifconfig solo informa dos interfaces, la que quiero (la dirección IP de acceso público) y loopback (127.0.0.1). Extraño que devuelva un alias de bucle invertido diferente.
ctpenrose

Agregaré que si use getLocalHost().getHostAddress()publica algo, puede verlo 0.0.0.0cuando mira desde otra computadora en la red. Esto se explica aquí. Esto es lo que me sucedió cuando estaba usando Gazebo en dos computadoras
Peter Mitrano, el

57

La publicación aquí probó el código de solución de ambigüedad IP de https://issues.apache.org/jira/browse/JCS-40 (InetAddress.getLocalHost () ambiguo en sistemas 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;
    }
}

66
Cabe señalar que esto todavía no resuelve la ambigüedad en caso de que el host tenga varias interfaces de trabajo similares.
Vadzim

1
la siguiente respuesta es mejor: stackoverflow.com/questions/9481865/… obtiene la dirección IP local que se utiliza como src para Default Gatway
Radu Toader

¿Por qué se agrega la dirección IP con barra diagonal frontal? como /10.39.0.17 ..?, ¿Siempre se debe recortar de esta manera ...?
Kanagavelu Sugumar

51

Puede usar la clase InetAddress de java para este propósito.

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

Salida para mi sistema = IP of my system is := 10.100.98.228

getHostAddress () devuelve

Devuelve la cadena de la dirección IP en una presentación textual.

O también puedes hacer

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

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


99
Tenga en cuenta que 10.xxx es una dirección privada, que indica que su sistema está en una red NAT. Aparecerá como una dirección diferente al contactar con el mundo exterior. Si realmente necesita la dirección IP externa, deberá comunicarse con uno de los muchos sitios que le devolverán la dirección IP de la que proviene. Esto puede o no ser útil para usted. Su sistema seguramente no será accesible desde el exterior en ningún caso.
Edward Falk

19

Cuando busque su dirección "local", debe tener en cuenta que cada máquina no solo tiene una única interfaz de red, y cada interfaz podría tener su propia dirección local. Lo que significa que su máquina siempre posee varias direcciones "locales".

Se elegirán automáticamente diferentes direcciones "locales" cuando se conecte a diferentes puntos finales. Por ejemplo, cuando te conectas google.com, estás usando una dirección local "externa"; pero cuando se conecta a su localhost, su dirección local siempre es localhostella misma, porque localhost es solo un bucle invertido.

A continuación se muestra cómo encontrar su dirección local cuando se comunica con google.com:

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

Increíble !! - tan fácil :)
smilyface

44
agregar socket.close () al final :)
MC

11

Ejemplo en scala (útil en el archivo 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

EDITAR 1: el código actualizado, desde el enlace anterior, ya no existe

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

VERSIÓN REAL: Esto dejó de funcionar

Esperemos que este fragmento pueda ayudarlo a lograr esto:

// 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 solución funcionaría, con suerte si siempre estoy conectado a Internet, pero no estoy garantizado. Además, cuando el sistema no está conectado a Internet y luego necesito devolver la dirección IP LAN del sistema, si corresponde, de lo contrario, el host local. Entonces no es una opción factible para mí. ¿¿Cualquier otra forma??
sasidhar

@sasidhar: cuando esté conectado a Internet, solo entonces tendrá su IP pública, supongo, si no está conectado, este método le dará su IP local o IP de LAN, y para la última condición especificada por usted puede devolver "127.0.0.1", en lugar de devolver Error.
VACA PRÁCTICA

1
Me gusta su enfoque, pero ese enlace parece que ya no funciona. ¿Puedo poner un controlador en mi propio sistema para que funcione en lugar de ese enlace externo y ser más confiable?
azerafati

1
@Bludream: Muchas gracias por informarme de que el enlace ya no funciona. He actualizado la publicación, con algunas entradas nuevas. Esperemos que funcione para tu usercase. Con respecto a su pregunta, realmente no sé cómo configurar un controlador en su propio sistema para que funcione. Por lo tanto, no podré dar una idea sobre este tema, MY BAD. Gracias de nuevo y
SIGA

1
Por mucho que sea una solución genial, es extremadamente poco confiable. Si tuviera que bloquear el hilo principal (digamos) y por cualquier razón whatismyip.comestuvo inactivo durante un período de tiempo prolongado, su aplicación también estaría inactiva :(. O devolverá datos basura y provocará un comportamiento inesperado. Además, esto devuelve el resultado externo la mayoría de direcciones IP detectable mediante whatismyip.com, no necesariamente la dirección IP de la máquina que está utilizando.
descifrado

6

primero importa la clase

import java.net.InetAddress;

en la clase

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

2
¡da solo la primera dirección IP incluso si no es la que está en uso!
Yahya

6

Puedes usar java.net.InetAddressAPI. Prueba esto :

InetAddress.getLocalHost().getHostAddress();

55
solo regresará 127.0.0.1
HCarrasko

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
por favor, considere agregar alguna explicación sobre lo que hace su código.
HCarrasko

4

¡Este es un ejemplo práctico de la respuesta ACEPTADA anterior! Esta clase de NetIdentity almacenará tanto la IP del host interno como el loopback local. Si está en un servidor basado en DNS, como se mencionó anteriormente, es posible que deba agregar algunas comprobaciones más, o posiblemente ir a la Ruta del archivo de configuración.

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

Cuando ejecuto este código, obtengo una impresión como esta:

    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

Para mi uso, estoy configurando un servidor Upnp, me ayudó a entender el 'patrón' que estaba buscando. Algunos de los objetos devueltos son adaptadores Ethernet, adaptadores de red, adaptadores de red virtual, controladores y adaptadores de cliente VPN. No todo tiene una dirección tampoco. Por lo tanto, querrá omitir los objetos de interfaz que no lo hacen.

También puede agregar esto al bucle para el actual 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());
}

Y verá información en su salida muy similar a esta:

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

Use InetAddress.getLocalHost () para obtener la dirección local

import java.net.InetAddress;

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

Mi dirección PPP Connection Ip es: 117.204.44.192 Pero lo anterior me devuelve 192.168.1.2
sasidhar

Debe rastrear todas las instancias de InetAddress disponibles y descubrir cuál es la correcta.
Decodificado el

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 enfoque bastante simplista que parece estar funcionando ...

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

Esto obtiene la dirección IP de su red si su máquina es parte de una red

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

0

Por lo general, cuando trato de encontrar mi dirección IP pública como cmyip.com o www.iplocation.net , utilizo de esta manera:

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

Dado que mi sistema (como tantos otros sistemas) tenía varias interfaces de red. InetAddress.getLocalHost()o Inet4Address.getLocalHost()simplemente me devolvió uno que no deseaba. Por lo tanto, tuve que usar este enfoque 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.

Solo tenga cuidado de que en este enfoque ya sabía que mi dirección IP deseada está en la 192.168.2subred.


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

por favor, agregue alguna explicación sobre lo que hace su código.
HCarrasko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.