2009-08-13 83 views
7

我使用以下类来测试主机是否接受来自java的连接与Java的测试套接字连接

我的问题是,这里可以增强什么?

感谢您的反馈

编辑

我已经加入以秒可选参数 “超时”。

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 2009-08-13 18:42:01

+2

我不想见到你的灵魂伴侣,然后:) – mgarciaisaia 2014-02-18 20:33:31

回答

3

增强?如果你正在谈论代码的复杂性:你没有任何循环(while,while),只有1个条件(if)。所以复杂度很难降低。

由于您在显示参数时的用法,我假设这将由用户使用,而不是由您自己的代码的另一部分使用。你需要保持这一点。

如果您担心在主机未响应时联系主机的时间,可以设置自己的超时时间。如果你不熟悉超时时间read this

您的代码对于主机响应的情况是最佳的。

+0

当它需要太多的连接时,它实际上让我感到不安。我修改了这个版本来处理可选参数“超时”现在我想知道是否使用“isUnresolved()”方法是好的。 :) – OscarRyz 2009-08-13 18:40:06

+2

小心:名称解析意味着查看主机名是否链接到一个IP地址。这不是一回事。例如www.google.com可以解析为66.102.1.147。 – 2009-08-13 19:09:54

+0

另外:“else if(args.length == 3)”是无用的,因为系统在if中退出。并且不要离开empy catch(NumberFormatException)...这不是一个好习惯。如果用户输入的值不是数字,那么您的代码将默默恢复为2000.沉默是好的;)但在这种情况下不会。 – 2009-08-13 19:17:34

2

该代码非常合理。而且由于时间短,所以没有太多的必须切断。

如果我编码端口扫描器,我会删除isInvalidInput方法。相反,我会假设输入是有效的。如果用户输入的内容不是有效整数,请在那里捕获解析错误并告诉他重新输入。