Как обнаружить состояние сервера в реализации Java сканера портов Java

StackOverflow https://stackoverflow.com/questions/2776729

  •  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 не имеет правила доступа к причине. Разборка исключения, кажется единственным способом, несмотря на это действительно грязно с переводами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top