java - publica - cual es mi ip privada
Obtenga la dirección IP local sin conectarse a Internet (5)
Por lo tanto, estoy tratando de obtener la dirección IP de mi máquina en mi red local (que debe ser 192.168.178.41
).
Mi primera intención fue usar algo como esto:
InetAddress.getLocalHost().getHostAddress();
pero solo devuelve 127.0.0.1
, que es correcto pero no muy útil para mí.
Busqué y encontré esta respuesta https://stackoverflow.com/a/2381398/717341 , que simplemente crea una conexión de Socket
a alguna página web (por ejemplo, "google.com") y obtiene la dirección de host local del socket :
Socket s = new Socket("google.com", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();
Esto funciona para mi máquina (devuelve 192.168.178.41
), pero necesita conectarse a Internet para funcionar. Dado que mi aplicación no requiere conexión a Internet y podría parecer "sospechosa" que la aplicación intente conectarse a Google cada vez que se lance, no me gusta la idea de usarla.
Entonces, después de investigar un poco más, tropecé con la clase NetworkInterface
, que (con algo de trabajo) también devuelve la dirección IP deseada:
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()){
NetworkInterface current = interfaces.nextElement();
System.out.println(current);
if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
Enumeration<InetAddress> addresses = current.getInetAddresses();
while (addresses.hasMoreElements()){
InetAddress current_addr = addresses.nextElement();
if (current_addr.isLoopbackAddress()) continue;
System.out.println(current_addr.getHostAddress());
}
}
En mi máquina, esto devuelve lo siguiente:
name:eth1 (eth1)
fe80:0:0:0:226:4aff:fe0d:592e%3
192.168.178.41
name:lo (lo)
Encuentra mis dos interfaces de red y devuelve la IP deseada, pero no estoy seguro de qué significa la otra dirección ( fe80:0:0:0:226:4aff:fe0d:592e%3
).
Además, no he encontrado una forma de filtrarlo desde las direcciones devueltas (usando los isXX()
del objeto InetAddress
) y luego usando RegEx, que me parece muy "sucio".
¿Alguna otra idea que no sea usar RegEx o Internet?
Aquí también hay una forma de hacerlo de Java 8:
public static String getIp() throws SocketException {
return Collections.list(NetworkInterface.getNetworkInterfaces()).stream()
.flatMap(i -> Collections.list(i.getInetAddresses()).stream())
.filter(ip -> ip instanceof Inet4Address && ip.isSiteLocalAddress())
.findFirst().orElseThrow(RuntimeException::new)
.getHostAddress();
}
La respuesta de Yankee es correcta para la primera parte. Para imprimir la dirección IP, puede obtenerla como una matriz de bytes y convertirla a la representación de cadena normal como esta:
StringBuilder ip = new StringBuilder();
for(byte b : current_addr.getAddress()) {
// The & here makes b convert like an unsigned byte - so, 255 instead of -1.
ip.append(b & 0xFF).append(''.'');
}
ip.setLength(ip.length() - 1); // To remove the last ''.''
System.out.println(ip.toString());
fe80: 0: 0: 0: 226: 4aff: fe0d: 592e es su dirección ipv6 ;-).
Verifica esto usando
if (current_addr instanceof Inet4Address)
System.out.println(current_addr.getHostAddress());
else if (current_addr instanceof Inet6Address)
System.out.println(current_addr.getHostAddress());
Si solo cuidas de IPv4, simplemente descarta el caso de IPv6. Pero ten cuidado, IPv6 es el futuro ^^.
PD: verifica si algunos de tus break
deberían haber continue
s.
import java.net.*;
public class Get_IP
{
public static void main(String args[])
{
try
{
InetAddress addr = InetAddress.getLocalHost();
String hostname = addr.getHostName();
System.out.println(addr.getHostAddress());
System.out.println(hostname);
}catch(UnknownHostException e)
{
//throw Exception
}
}
}
public static String getIp(){
String ipAddress = null;
Enumeration<NetworkInterface> net = null;
try {
net = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
throw new RuntimeException(e);
}
while(net.hasMoreElements()){
NetworkInterface element = net.nextElement();
Enumeration<InetAddress> addresses = element.getInetAddresses();
while (addresses.hasMoreElements()){
InetAddress ip = addresses.nextElement();
if (ip instanceof Inet4Address){
if (ip.isSiteLocalAddress()){
ipAddress = ip.getHostAddress();
}
}
}
}
return ipAddress;
}