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 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 debe registrar su IP en el nodo de arranque. Intenté usar cli.getInetAddress()
una vez que el cliente se conecta al ServerSocket
nodo de arranque, pero eso no funcionó.
- Necesito que el cliente registre su IP PPP si está disponible;
- De lo contrario, la LAN IP si está disponible;
- 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
Respuestas:
De esta manera funciona bien cuando hay múltiples interfaces de red. Siempre devuelve la IP saliente preferida. El destino
8.8.8.8
no es necesario para ser accesible.Connect
en 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:
fuente
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?
NetworkInterface.getNetworkInterfaces()
para obtener todas las interfaces de red conocidas en el host y luego iterar sobre las direcciones de cada NI.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?)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".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.
fuente
use getLocalHost().getHostAddress()
publica algo, puede verlo0.0.0.0
cuando mira desde otra computadora en la red. Esto se explica aquí. Esto es lo que me sucedió cuando estaba usando Gazebo en dos computadorasLa 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):
fuente
Puede usar la clase InetAddress de java para este propósito.
Salida para mi sistema =
IP of my system is := 10.100.98.228
getHostAddress () devuelve
O también puedes hacer
Salida =
IP of my system is := RanRag-PC/10.100.98.228
fuente
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 sulocalhost
, su dirección local siempre eslocalhost
ella 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
:fuente
Ejemplo en scala (útil en el archivo sbt):
fuente
EDITAR 1: el código actualizado, desde el enlace anterior, ya no existe
VERSIÓN REAL: Esto dejó de funcionar
Esperemos que este fragmento pueda ayudarlo a lograr esto:
fuente
whatismyip.com
estuvo 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 mediantewhatismyip.com
, no necesariamente la dirección IP de la máquina que está utilizando.primero importa la clase
en la clase
fuente
Puedes usar
java.net.InetAddress
API. Prueba esto :fuente
fuente
¡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.
Cuando ejecuto este código, obtengo una impresión como esta:
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
Y verá información en su salida muy similar a esta:
fuente
Use InetAddress.getLocalHost () para obtener la dirección local
fuente
fuente
Un enfoque bastante simplista que parece estar funcionando ...
fuente
Esto obtiene la dirección IP de su red si su máquina es parte de una red
fuente
Por lo general, cuando trato de encontrar mi dirección IP pública como cmyip.com o www.iplocation.net , utilizo de esta manera:
fuente
Dado que mi sistema (como tantos otros sistemas) tenía varias interfaces de red.
InetAddress.getLocalHost()
oInet4Address.getLocalHost()
simplemente me devolvió uno que no deseaba. Por lo tanto, tuve que usar este enfoque ingenuo.Solo tenga cuidado de que en este enfoque ya sabía que mi dirección IP deseada está en la
192.168.2
subred.fuente
fuente