如何检测服务器状态的端口扫描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:进行连接超时
如果服务器不活或端口是关闭的。
任何想法?提前致谢!
答
我不认为除解析异常消息外您还有其他选择。你有没有理由不这样做?
答
ConnectException只有一个空的构造和errorMesssage构造。 API中没有ConnectException的子类。所以我担心,Java没有正确的方法来访问原因。解析异常消息似乎是唯一的方法,尽管它对翻译非常混乱。
我认为这是一个有点“脏”到字符串消息计数上发生了什么,所以我宁愿不要去那个决定。我只是想知道是否有另一个我不知道的选择。 – 2010-05-06 15:53:40