2009-08-13 5 views
7

호스트에서 자바 연결을 허용하는지 테스트하려면 다음 클래스를 사용하고 있습니다.자바와 테스트 소켓 연결

내 질문에 무엇이 개선 될 수 있습니까? 피드백

편집

에 대한

덕분에 나는 초 선택적 매개 변수 "타임 아웃"을 추가했습니다.

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

if() try {constructs : P – OscarRyz

+2

나는 당신의 영혼을 만나고 싶지 않다. :) – mgarciaisaia

답변

3

개선 되었습니까? 코드의 복잡성에 대해 이야기하고 있다면 루프가 없습니다 (while). 단 하나의 조건 (if) 만 있습니다. 따라서 복잡성을 거의 줄일 수 없습니다.

인자를 사용할 때 사용법을 표시하기 때문에 사용자 코드에서 다른 부분이 아닌 사용자가 사용한다고 가정합니다. 당신은 이것을 지켜야합니다.

응답하지 않을 때 호스트에 연결하는 데 걸리는 시간이 걱정되면 자신의 제한 시간을 설정할 수 있습니다. 시간 초과에 익숙하지 않은 경우 read this.

코드는 호스트가 응답하는 경우에 가장 적합합니다.

+0

연결하는 데 너무 많은 시간이 걸리는 것은 실제로 나를 괴롭힌다. 선택적 매개 변수 "timeout"을 처리하기 위해이 버전을 수정했습니다. 이제 "isUnresolved()"메서드를 사용하면 좋을지 궁금합니다. :) – OscarRyz

+2

주의 : 이름 해석은 호스트 이름이 IP 주소에 연결되는지 확인하는 것을 의미합니다. 그것은 같은 것이 아닙니다. 예를 들어 www.google.com은 66.102.1.147로 확인할 수 있습니다. –

+0

또한 : "else if (args.length == 3)"는 시스템이 if에서 종료되기 때문에 쓸모가 없습니다. empy catch (NumberFormatException)를 남겨 두지 마십시오. 좋은 연습이 아닙니다. 사용자가 숫자가 아닌 값을 입력하면 코드가 자동으로 2000으로 되돌아갑니다. 침묵은 좋지만이 경우는 아닙니다. –

2

코드가 매우 적합합니다. 그리고 짧기 때문에, 너무 많이 잘라내어야합니다.

포트 스캐너를 코딩하는 경우 isInvalidInput 메서드가 제거됩니다. 대신에 입력이 유효하다고 가정합니다. 사용자가 유효한 정수가 아닌 내용을 입력하면 구문 분석 오류를 찾아서 다시 입력하도록합니다.