Varias formas de probar la conectividad de la red usando Java
Descripción general En la programación de redes, a veces necesitamos determinar la conectividad entre dos máquinas o la accesibilidad de la red de una máquina a otra. En las pruebas a nivel de sistema, solemos utilizar el comando Ping para la verificación. Aunque Java proporciona una biblioteca de clases de programación de red relativamente rica (que incluye lectura de recursos de red basada en URL en la capa de aplicación, programación de sockets basada en la capa TCP/IP y algunas bibliotecas de clases auxiliares), no proporciona directamente comandos como Ping. probar la conectividad de la red. Este artículo presentará cómo utilizar la API existente de Java para implementar mediante programación el juicio de accesibilidad de la red entre dos máquinas en varios escenarios. En los siguientes capítulos, utilizaremos algunas bibliotecas de clases de programación de redes Java java.net.InetAddress y java.net.Socket para explicar cómo simular el comando Ping a través de ejemplos. Volver arriba Simplemente determine la accesibilidad de dos máquinas. En circunstancias normales, solo necesitamos determinar si una máquina puede acceder (Ping) a otra máquina. En este momento, simplemente podemos usar java.net en la biblioteca de clases de Java. Clase InetAddress para implementar, esta clase proporciona dos métodos para detectar si se puede acceder a la máquina remota?0?2boolean isReachable(int?0?2timeout) //0?2Probar si la dirección es accesible?0?2boolean isReachable(NetworkInterface? 0 ?2netif, int?0?2ttl, int?0?2timeout) //0?2 prueba si la dirección es accesible. En pocas palabras, el método anterior consiste en construir el objeto InetAddress a través de la dirección IP de la máquina remota y luego. llame a su método isReachable para probar la accesibilidad de la red de la máquina que llama y la máquina remota. Tenga en cuenta que la máquina remota puede tener varias direcciones IP, por lo que es posible que desee probar todos los escenarios de forma iterativa.
Listado 1: Juicio simple de la accesibilidad de dos máquinas void isAddressAvailable(String ip){ try{ InetAddress address = InetAddress.getByName(ip);//haga ping a esta IP if(addressstanceof java.net.Inet4Address){ System.out. println(ip + "es la dirección ipv4"); }else if(dirección instancia de java.net.Inet6Address){ System.out.println(ip + "es la dirección ipv6"); "no está reconocido"); } if(address.isReachable(5000)){ System.out.println("ÉXITO - ping " + IP + " sin interfaz especificada"); - ping " + IP + " sin interfaz especificada"); } System.out.println("\n-------Probando diferentes interfaces--------\n"); Enumeración< NetworkInterface > netInterfaces = NetworkInterface.getNetworkInterfaces(); while(netInterfaces.hasMoreElements()) { NetworkInterface ni = netInterfaces.nextElement() System.out.println( "Comprobando interfaz, DisplayName:" + ni.getDisplayName() + ", Nombre :" + ni.getName()); if(address.isReachable(ni, 0, 5000)){ System.out.println("ÉXITO - ping " + ip); }else{ System.out.println(" FALLO - ping " + ip); } Enumeración
Diferentes interfaces-------- Comprobando la interfaz, DisplayName:MS TCP Loopback interface, Nombre:lo FALLO - ping 10.13.20.70 IP: 127.0.0.1 ---------------- -------------------------- Comprobando interfaz, DisplayName:Intel(R) Centrino(R) Advanced-N 6200 AGN - Teefer2 Miniport, Nombre: ERROR de eth0 - ping 10.13.20.70 IP: 9.123.231.40 -------------------------------------- -- ------ Comprobando la interfaz, Nombre para mostrar: Conexión de red Gigabit Intel(R) 82577LM - Minipuerto Teefer2, Nombre: eth1 ÉXITO - ping 10.13.20.70 ---------------- ---------------------------- Comprobando la interfaz, DisplayName:Interfaz WAN (PPP/SLIP), Nombre:ppp0 ÉXITO - ping 10.13.20.70 IP: 10.0 .50.189 --------------------------------------------- - ----- ---------END-------------- De lo anterior, podemos ver el uso de isReachable. Puede juzgar la accesibilidad del control remoto. red sin especificar ninguna interfaz, pero esto No puede distinguir desde qué interfaz de red se envía el paquete de datos (si hay varias interfaces de red local y la versión avanzada de isReachable puede especificar desde qué interfaz de red local probar, para que usted pueda); Sepa con precisión que la red remota se puede conectar a qué interfaz de red local. Sin embargo, Java en sí no proporciona ningún método para determinar qué dirección IP local puede conectarse a la red remota, y la interfaz de programación de red Java no proporciona un método para acceder a los paquetes de datos del protocolo ICMP, por lo que no es posible lograr esto a través de ICMP. Es posible que los paquetes de datos de la red sean inalcanzables (por supuesto, se puede implementar usando JNI, pero depende de la plataforma del sistema), en este momento puede considerar el método propuesto en la siguiente sección de este artículo. Volver arriba Especifique direcciones de red local y remota para determinar la accesibilidad entre dos máquinas. En algunos casos, es posible que necesitemos determinar qué dirección de red local puede conectarse a la red remota para que la red remota pueda volver a conectarse a la máquina local mediante un. algunos prestan determinados servicios o emiten determinadas notificaciones. Un escenario de aplicación típico es que un servicio de transferencia de archivos (como FTP) se inicia localmente y se debe enviar una dirección IP local a la máquina remota para que la máquina remota pueda descargar archivos a través de esta dirección o que la máquina remota proporcione cierto servicio; Cuando ocurren ciertos eventos, notifique a la máquina registrada para obtener estos eventos (común en el campo de la administración del sistema), por lo que debe proporcionar una dirección local accesible (desde el control remoto) al registrarse. Aunque podemos usar el método InetAddress.isReachabl para determinar qué interfaz de red local se puede conectar a la reproducción remota, no es adecuado aquí porque una única interfaz de red se puede configurar con múltiples direcciones IP. Podemos usar Socket para establecer una posible conexión TCP y luego determinar si una dirección IP local es accesible a la red remota.
Usamos el método de conexión void connect(SocketAddress?0?2endpoint, int?0?2timeout) en java.net.Socket class?0?2//Use Socket para conectarse al servidor y especificar el tiempo de espera que requiere este método. un puerto remoto, que puede ser cualquier puerto de servicio abierto basado en el protocolo TCP (como el puerto de servicio ECHO 7 generalmente abierto, el puerto de servicio SSH 22 de Linux, etc.). De hecho, la pila de protocolos coloca la conexión TCP establecida en la cola de conexiones y luego la distribuye a varios servicios de aplicaciones que realmente procesan los datos. Dado que UDP no tiene un proceso de conexión, los servicios basados en UDP (como SNMP) no pueden ser utilizados. aplicado en este método. El proceso específico es enumerar cada dirección de red local, establecer un socket local e intentar conectarse a la dirección remota en un puerto determinado. Si se puede conectar, significa que la dirección local puede llegar a la red remota.
Listado de programas 2: Especifique la dirección local y la dirección remota para determinar la accesibilidad entre las dos máquinas void printReachableIP(InetAddress remoteAddr, int port){ String retIP = null Enumeration
rintln("FALLO - ¡No se puede conectar! Local: " + localInetAddr.getHostAddress() + " remoto: " + remotoInetAddr.getHostAddress() + " puerto" + puerto } finalmente{ if(socket != null) { try{); socket.close(); } catch(IOException e) { System.out.println("Se produjo un error al cerrar el socket.."); ---INICIO-------------- FALLO - ¡No se puede conectar! Local: 127.0.0.1 remoto: 10.8.1.50 puerto 22 FALLO - ¡No se puede conectar! Local: 9.123.231.40 remoto: 10.8. 1.50 puerto 22 ÉXITO: conexión establecida Local: 10.0.50.189 remoto: 10.8.1.50 puerto 22 Se encontró una IP local accesible, es 10.0.50.189 --------------END------ -------- Volver arriba Programación de redes mixtas IPv4 e IPv6 Cuando existen IPv4 e IPv6 en el entorno de red, es decir, cuando la máquina tiene direcciones IPv4 e IPv6, podemos realizar algunas optimizaciones en el programa. como Dado que las direcciones IPv4 e IPv6 no pueden acceder entre sí, solo es necesario determinar la accesibilidad entre direcciones IPv4 y entre direcciones IPv6. No es necesario juzgar la dirección de retorno IPv4 y también se puede omitir la prueba para la dirección local de enlace IPv6. Según las necesidades reales, podemos dar prioridad al uso de IPv4 o IPv6 para mejorar la eficiencia del juicio. dirección local y dirección remota Si son IPv4 o IPv6 // Determinar si es IPv4 o IPv6 if(!((localInetAddr instanciadeInet4Address) && (remoteInetAddr instanciadeInet4Address) || (localInetAddr instanciadeInet6Address) && (remoteInetAddr instanciadeInet6Address))){ // El local y el remoto no son IPv4 al mismo tiempo o IPv6, omita esta situación y no detecte la interrupción } Listado 4: Omita la dirección local y la dirección LinkLocal if( localAddr.isLoopbackAddress() || localAddr.isAnyLocalAddress() || localAddr; .isLinkLocalAddress() ){ // Dirección Es la dirección de bucle invertido local, omita la interrupción } Volver arriba Resumen y Outlook Este artículo enumera escenarios típicos e introduce varias formas de determinar la accesibilidad entre máquinas a través de la interfaz de programación de red Java. En aplicaciones prácticas, los métodos correspondientes se pueden seleccionar y modificar ligeramente según las diferentes necesidades. Para necesidades más especiales, también puede considerar llamar directamente a la API del sistema a través del método JNI, que puede proporcionar funciones más potentes y flexibles, por lo que no entraré en detalles aquí.
Referencias Aprendizaje Consulte el artículo de DeveloperWorks Programación del entorno de ejecución de red para aplicaciones Java para obtener más información sobre la programación de red. Si desea realizar programación de red a través de JNI, puede consultar el artículo Programación Java con JNI en developmentWorks para obtener más información y ejemplos relacionados con JNI. Consulte el Javadoc para obtener más información sobre la API de programación de red Java. Zona de tecnología Java de DeveloperWorks: cientos de artículos sobre todos los aspectos de la programación Java. Analice cómo unirse a la comunidad china de DeveloperWorks. Consulte blogs, foros, grupos y wikis dirigidos a desarrolladores y conéctese con otros usuarios de DeveloperWorks. Acerca del autor Wu Xiaojun, ingeniero de software CSTL de IBM, ha estado involucrado en el desarrollo de software relacionado con la administración de sistemas IBM durante mucho tiempo y actualmente es responsable del desarrollo de Director6.1 Update Manager. Liu Guanqun es actualmente ingeniero de software en el Centro de desarrollo de tecnología de sistemas (CSTL) de IBM Shanghai. Tiene muchos años de experiencia en programación Java y C++ y tiene un gran interés en la implementación interna de sistemas operativos, redes y lenguajes de programación. Cerrar [x] Ayuda para denunciar abuso Informar abuso ¡Gracias! Este contenido ha sido marcado para la atención de los administradores. Cerrar [x] Ayuda para denunciar abuso Informar abuso Error al enviar el informe de abuso. Inténtelo de nuevo más tarde. Cerrando [x]developerWorks: Inicie sesión en IBM ID: ¿Necesita una ID de IBM? ¿Olvidó su ID de IBM? Contraseña: ¿Olvidaste tu contraseña? Cambie su contraseña Manténgase conectado. Al hacer clic en Enviar, acepta los términos y condiciones de DeveloperWorks. Términos de uso Cuando inicia sesión por primera vez en DeveloperWorks, se crea un perfil para usted. La información que elija hacer pública en su perfil de DeveloperWorks será visible públicamente para otros, pero podrá modificar su visibilidad en cualquier momento. Su nombre (a menos que elija ocultarlos) y su apodo aparecerán con el contenido que publique en desarrolladorWorks. Toda la información enviada se mantiene segura. Cerrar [x] Seleccione su apodo: cuando inicie sesión por primera vez en desarrolladorWorks, se creará un perfil para usted y deberá especificar un apodo. Su apodo aparecerá con el contenido que publique en desarrolladorWorks. La longitud del apodo puede tener entre 3 y 31 caracteres. Su apodo debe ser único dentro de la comunidad de DeveloperWorks y, por razones de privacidad, no puede ser su dirección de correo electrónico. Apodo: (Longitud entre 3 y 31 caracteres) Al hacer clic en Enviar, acepta los términos y condiciones de DeveloperWorks. Términos de uso. Toda la información enviada se mantiene segura. Califica este artículo y comenta volver arriba