如何检测服务器状态的端口扫描java实现

问题描述:

我用Java编写的端口扫描器,我希望能够以不同的以下4个用例:如何检测服务器状态的端口扫描java实现

  • 端口是开放的
  • 端口是开放的和服务器的旗帜阅读
  • 端口关闭
  • 服务器不住

我有以下代码:

InetAddress address = InetAddress.getByName("google.com"); 
    int[] ports = new int[]{21, 22, 23, 80, 443}; 
    for (int i = 0; i < ports.length; i++) { 
     int port = ports[i]; 
     Socket socket = null; 
     try { 
      socket = new Socket(address, port); 
      socket.setSoTimeout(500); 
      System.out.println("port " + port + " open"); 
      BufferedReader reader = new BufferedReader(
       new InputStreamReader(socket.getInputStream())); 
      String line = reader.readLine(); 
      if (line != null) { 
       System.out.println(line); 
      } 
      socket.close(); 
     } catch (SocketTimeoutException ex) { 
      // port was open but nothing was read from input stream 
      ex.printStackTrace(); 
     } catch (ConnectException ex) { 
      // port is closed 
      ex.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (socket != null && !socket.isClosed()) { 
       try { 
        socket.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

的问题是,我得到一个ConnectionException既当口被关闭,服务器将无法达到,但具有不同的异常消息:

java.net.ConnectException:连接超时:连接

当从未建立连接和

java.net.ConnectException:拒绝连接:连接

当端口关闭

,所以我不能让两个用例之间的区别没有挖掘到实际的异常消息。

当我为套接字创建尝试不同的方法时,会发生同样的事情。如果我使用:

socket = new Socket(); 
socket.setSoTimeout(500); 
socket.connect(new InetSocketAddress(address, port), 1000); 

我有同样的问题,但与SocketTimeoutException相反。我得到一个

java.net.SocketTimeoutException:读超时

如果端口是开放的,但没有被读旗帜,

java.net.SocketTimeoutException:进行连接超时

如果服务器不活端口是关闭的。

任何想法?提前致谢!

我不认为除解析异常消息外您还有其他选择。你有没有理由不这样做?

+0

我认为这是一个有点“脏”到字符串消息计数上发生了什么,所以我宁愿不要去那个决定。我只是想知道是否有另一个我不知道的选择。 – 2010-05-06 15:53:40

ConnectException只有一个空的构造和errorMesssage构造。 API中没有ConnectException的子类。所以我担心,Java没有正确的方法来访问原因。解析异常消息似乎是唯一的方法,尽管它对翻译非常混乱。