2010-05-05 23 views
1

我用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:進行連接超時

如果服務器不活端口是關閉的。

任何想法?提前致謝!

回答

1

我不認爲除解析異常消息外您還有其他選擇。你有沒有理由不這樣做?

+0

我認爲這是一個有點「髒」到字符串消息計數上發生了什麼,所以我寧願不要去那個決定。我只是想知道是否有另一個我不知道的選擇。 – 2010-05-06 15:53:40

0

ConnectException只有一個空的構造和errorMesssage構造。 API中沒有ConnectException的子類。所以我擔心,Java沒有正確的方法來訪問原因。解析異常消息似乎是唯一的方法,儘管它對翻譯非常混亂。