obtener nombre maquina con cliente java sockets ip

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



obtener ip en java netbeans (16)

Estoy tratando de desarrollar un sistema donde haya diferentes nodos que se ejecuten en un sistema diferente o en puertos diferentes 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 un nodo de arranque. Los nodos crean su propio ServerSocket y 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 deba registrar su IP en el nodo de arranque. Intenté usar cli.getInetAddress() una vez que el cliente se cli.getInetAddress() al ServerSocket del nodo de arranque, pero eso no funcionó.

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

Utilizando el código:

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

o

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

La dirección IP de mi 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 NetworkInterface s, pero ¿cómo los distingo? Esta es la salida que estoy recibiendo:

127.0.0.1 192.168.1.2 192.168.56.1 117.204.44.19


¡Este es un ejemplo de trabajo de la respuesta ACEPTADA arriba! Esta clase NetIdentity almacenará tanto la IP del host interno como el bucle local. Si se encuentra en un servidor basado en DNS, como se mencionó anteriormente, es posible que deba agregar algunas verificaciones más o 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 comprender el "patrón" que estaba buscando. Algunos de los objetos devueltos son adaptadores de Ethernet, adaptadores de red, adaptadores de red virtuales, controladores y adaptadores de cliente VPN. No todo tiene una dirección tampoco. Así que querrás saltarte objetos de interfaz que no lo hagan.

También puede agregar esto al bucle para el NetworkInterface i 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ás información en tu salida como 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


Cuando busque su dirección "local", debe tener en cuenta que cada máquina no solo tiene una única interfaz de red, y que 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" para usar cuando se conecte a diferentes puntos finales. Por ejemplo, cuando se conecta a google.com , está utilizando una dirección local "externa"; pero cuando te conectas a tu localhost , tu dirección local siempre es localhost , porque localhost es solo un bucle de retorno.

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

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


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


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

A primera vista, InetAddress.getLocalHost() debería proporcionarle la dirección IP de este host. El problema es que un host puede tener muchas interfaces de red y una interfaz puede estar vinculada a más de una dirección IP. Y para colmo, no se podrá acceder a todas las direcciones IP fuera de su máquina o de 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 para usar.

¿Cómo puedes lidiar con esto?

  • Un enfoque es usar 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 usar 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 comandos.
  • Otra variación es obtener la dirección IP preferida de un archivo de configuración o un parámetro de línea de comandos.

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 de retorno". 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 local del sitio). 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 hasta 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 hasta 239.xxx.xxx.xxx son direcciones de multidifusión.
  • La dirección 255.255.255.255 es la dirección de transmisión.
  • Cualquier otra cosa debe ser una dirección IPv4 pública válida de punto a punto.

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


Generalmente cuando intento encontrar mi dirección IP pública como cmyip.com o www.iplocation.net , uso esta forma:

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


La publicación aquí probó el código de solución de ambigüedad de 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; } }


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

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

La salida para mi sistema = IP of my system is := 10.100.98.228

getHostAddress() devuelve

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

O también puedes hacer

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

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


Puedes usar java.net.InetAddress API. Prueba esto :

InetAddress.getLocalHost().getHostAddress();


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


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


en primer lugar importar 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


EDIT 1: el código actualizado, ya que 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 ACTUAL: Esto dejó de funcionar.

Esperemos que este fragmento pueda ayudarte 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"; } } }


import java.net.DatagramSocket; 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 de salida preferida. El destino 8.8.8.8 no es necesario para ser alcanzable.

Connect en un socket UDP tiene el siguiente efecto: establece el destino para Enviar / Recv, descarta todos los paquetes de otras direcciones y, que es lo que usamos, transfiere el socket al estado "conectado" y configura los campos correspondientes. Esto incluye verificar la existencia de la ruta hacia el destino de acuerdo con la tabla de enrutamiento del sistema y configurar el punto final local en consecuencia. La última parte parece estar sin documentar 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 en Windows y 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.


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


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


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