我用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:進行連接超時
如果服務器不活或端口是關閉的。
任何想法?提前致謝!
我認爲這是一個有點「髒」到字符串消息計數上發生了什麼,所以我寧願不要去那個決定。我只是想知道是否有另一個我不知道的選擇。 – 2010-05-06 15:53:40