2009-08-13 22 views
7

estoy usando la siguiente clase para probar si un host acepta la conexión de Javaprueba con Java

Mi pregunta es, ¿qué se podría mejorar en esta lista?

Gracias por los comentarios

EDITAR

que han añadido el parámetro "tiempo de espera" opcional en cuestión de segundos.

import java.io.IOException; 
import java.net.Socket; 
import java.net.InetSocketAddress; 
import java.net.SocketAddress; 

public class TestConnection { 

    public static void main(String [] args) { 

     int timeout = 2000; // two seconds  

     if(isInvalidInput(args)) { 

      System.err.println("Usage: java TestConnection remotehost port [timeout_seconds]"); 
      System.exit(-1); 

     } else if (args.length == 3) try { 

      timeout = Integer.parseInt(args[2]) * 1000; 

     } catch(NumberFormatException nfe){} 

     String host = args[0]; 
     String port = args[1]; 

     System.out.printf("Attempting: %s port: %s ....\n", host, port); 

     Socket socket = new Socket(); 
     InetSocketAddress endPoint = new InetSocketAddress(host, 
               Integer.parseInt(port) ); 

     if (endPoint.isUnresolved()) { 

      System.out.println("Failure " + endPoint); 

     } else try { 

      socket.connect( endPoint , timeout); 
      System.out.printf("Success: %s \n", endPoint); 

     } catch(IOException ioe) { 

      System.out.printf("Failure: %s message: %s - %s \n", 
       endPoint , ioe.getClass().getSimpleName(), ioe.getMessage()); 

     } finally { 

      if (socket != null) try { 
       socket.close(); 
      } catch(IOException ioe) {} 

     } 

    } 

    /** 
    * Validates the number of arguments is exactly 2 and the second is a number. 
    * @return true is args.length == 2 && args[1].matches(\\d+); 
    */ 
    private static final boolean isInvalidInput(String [] args) { 
     return (args.length < 2 
        || (args.length >= 2 && !args[1].matches("\\d+"))); 
    } 

} 
+2

Me encanta el if() try {constructs: P – OscarRyz

+2

No quiero conocer a tu alma gemela, entonces :) – mgarciaisaia

Respuesta

3

Mejorado? Si habla bien de la complejidad de su código: no tiene ningún bucle (para, mientras), solo 1 condición (si). Entonces, la complejidad difícilmente podría reducirse.

Dado que está mostrando el uso cuando se usan los argumentos, supongo que será utilizado por el usuario y no por otra parte de su propio código. Debes mantener esto.

Si le preocupa el tiempo que lleva ponerse en contacto con el host cuando no responde, puede establecer su propio tiempo de espera. Si no está familiarizado con los tiempos de espera read this.

Su código es óptimo para el caso en que el host responde.

+0

En realidad me molesta cuando se necesita demasiado para conectarse. He modificado esta versión para manejar el parámetro opcional "timeout". Ahora me pregunto si el método "isUnresolved()" es bueno o no. :) – OscarRyz

+2

Cuidado: la resolución del nombre significa ver si el nombre de host se vincula a una dirección IP. No es la misma cosa. Por ejemplo, www.google.com se puede resolver a 66.102.1.147. –

+0

También: el "else if (args.length == 3)" es inútil porque el sistema sale en if. Y no dejes que empy catch (NumberFormatException) ... no sea una buena práctica. Si el usuario ingresa un valor que no es un número, su código volverá silenciosamente a 2000. El silencio es bueno;) pero no en este caso. –

2

El código es muy razonable. Y como es corto, no hay demasiado que deba cortarse.

Si estuviera codificando el escáner de puertos, eliminaría el método isInvalidInput. En lugar de eso, asumiría que la entrada fue válida. Si un usuario ingresa algo que no es un número entero válido, detecte el error de análisis allí y dígale que vuelva a ingresar.