2009-08-13 34 views
7

Tôi đang sử dụng lớp sau để kiểm tra xem máy chủ có chấp nhận kết nối từ javakết nối ổ cắm thử nghiệm với Java

Câu hỏi của tôi là, điều gì có thể được cải thiện ở đây?

Cảm ơn thông tin phản hồi

EDIT

Tôi đã thêm tham số tùy chọn "timeout" trong vài giây.

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

Tôi yêu if() try {constructs: P – OscarRyz

+2

Tôi không muốn gặp người bạn tâm hồn của bạn, sau đó :) – mgarciaisaia

Trả lời

3

Được nâng cao? Nếu bạn đang nói về sự phức tạp của mã của bạn tốt: bạn không có bất kỳ vòng lặp (cho, trong khi), chỉ có 1 điều kiện (nếu). Vì vậy, sự phức tạp khó có thể giảm được.

Vì bạn đang hiển thị mức sử dụng khi đối số, tôi cho rằng điều này sẽ được người dùng sử dụng chứ không phải bởi một phần khác của mã của riêng bạn. Bạn cần phải giữ điều này.

Nếu bạn lo lắng về thời gian cần thiết để liên hệ với máy chủ khi nó không phản hồi, bạn có thể đặt thời gian chờ của riêng bạn. Nếu bạn không quen với thời gian chờ read this.

Mã của bạn là tối ưu đối với trường hợp máy chủ phản hồi.

+0

Nó thực sự gây lỗi cho tôi khi phải mất quá nhiều thời gian để kết nối. Tôi đã sửa đổi phiên bản này để xử lý tham số tùy chọn "timeout" Bây giờ tôi tự hỏi nếu sử dụng "isUnresolved()" phương pháp là tốt hay không. :) – OscarRyz

+2

Cẩn thận: tên giải quyết có nghĩa là để xem nếu tên máy chủ liên kết đến một địa chỉ ip. Nó không phải là điều tương tự. Ví dụ: www.google.com có ​​thể được giải quyết thành 66.102.1.147. –

+0

Ngoài ra: "else if (args.length == 3)" là vô dụng vì hệ thống thoát trong if. Và đừng rời khỏi sự nắm bắt empy (NumberFormatException) ... nó không phải là một thực hành tốt. Nếu người dùng nhập vào một giá trị mà không phải là một số mã của bạn sẽ âm thầm trở lại năm 2000. Im lặng là tốt;) nhưng không phải trong trường hợp này. –

2

Mã này rất hợp lý. Và kể từ khi nó ngắn, không có quá nhiều mà phải được cắt ra.

Nếu tôi mã hóa trình quét cổng, tôi sẽ xóa phương thức isInvalidInput. Thay vào đó, tôi cho rằng đầu vào là hợp lệ. Nếu người dùng nhập nội dung nào đó không phải là số nguyên hợp lệ, hãy bắt lỗi phân tích cú pháp đó và yêu cầu anh ấy nhập lại.

Các vấn đề liên quan