Как обнаружить состояние сервера в реализации Java сканера портов Java
-
03-10-2019 - |
Вопрос
Я пишу сканер портов в Java, и я хочу иметь возможность отличить следующие 4 случая использования:
- порт открыт
- порт открыт и сервер баннер был прочитан
- порт закрыт
- Сервер не живет
У меня есть следующий код:
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: Время соединения OUT: Connect
когда соединение никогда не было установлено и
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 в API. Поэтому я боюсь, Java не имеет правила доступа к причине. Разборка исключения, кажется единственным способом, несмотря на это действительно грязно с переводами.