2009-08-13 12 views
7

Używam poniższej klasy do sprawdzenia, czy host akceptuje połączenie z javapołączenie gniazda testowego z językiem Java

Moje pytanie brzmi, co można poprawić tutaj?

Dzięki za opinie

EDIT

Dodałem opcjonalny parametr "timeout" w kilka sekund.

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

Uwielbiam if() try {konstruuje: P – OscarRyz

+2

Nie chcę spotkać twojej bratniej duszy, wtedy :) – mgarciaisaia

Odpowiedz

3

Ulepszona? Jeśli mówisz o złożoności kodu dobrze: nie masz żadnej pętli (dla, podczas), tylko 1 warunek (jeśli). Tak więc złożoność trudno było zmniejszyć.

Ponieważ wyświetla się użycie, gdy argumenty, zakładam, że będzie to używane przez użytkownika, a nie przez inną część własnego kodu. Musisz to zatrzymać.

Jeśli martwisz się o czas potrzebny na skontaktowanie się z hostem, gdy nie odpowiada, możesz ustawić swój limit czasu. Jeśli nie znasz limitów czasu, read this.

Twój kod jest optymalny dla przypadku, w którym host odpowiada.

+0

To faktycznie buga mnie, kiedy to bierze za dużo by połączyć się. Zmodyfikowałem tę wersję, aby obsługiwać opcjonalny parametr "timeout" Teraz zastanawiam się, czy użycie metody "isUnresolved()" jest dobre czy nie. :) – OscarRyz

+2

Ostrożnie: rozwiązywanie nazw oznacza, czy nazwa hosta łączy się z adresem IP. To nie to samo. Na przykład www.google.com można rozwiązać na 66.102.1.147. –

+0

Ponadto: "else if (args.length == 3)" jest bezużyteczne, ponieważ system kończy działanie w if. I nie zostawiaj empy catch (NumberFormatException) ... to nie jest dobra praktyka. Jeśli użytkownik wprowadzi wartość, która nie jest liczbą, twój kod milcząco powróci do 2000. Milczenie jest dobre;) ale nie w tym przypadku. –

2

Kod jest bardzo rozsądny. A skoro jest krótki, nie ma zbyt wiele, co trzeba wyciąć.

Jeśli koduję skaner portów, powinienem usunąć metodę isInvalidInput. Zamiast tego, zakładam, że dane wejściowe były prawidłowe. Jeśli użytkownik wprowadzi coś, co nie jest poprawną liczbą całkowitą, przechwyć tam błąd analizy i powiedz mu, aby ponownie go wprowadził.

Powiązane problemy