Comment puis-je détecter l'état du serveur dans un scanner de port implémentation Java

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

  •  03-10-2019
  •  | 
  •  

Question

Je suis en train d'écrire un scanner de port en Java et je veux être en mesure de les 4 distincts cas d'utilisation suivants:

  • port est ouvert
  • port est ouvert bannière et le serveur a été lu
  • port est fermé
  • serveur n'est pas en direct

Je le code suivant:

    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();
                }
            }
        }
    }

Le problème est que je reçois un ConnectionException aussi bien lorsque le port est fermé et que le serveur ne peut pas être atteint, mais avec un message d'exception différente:

java.net.ConnectException: Connexion timed out: connect

lorsque la connexion n'a jamais été établie et

java.net.ConnectException: Connexion refusée: connexion

lorsque le port a été fermé

donc je ne peut pas faire la distinction entre les deux cas d'utilisation sans creuser dans le message d'exception réelle.

Même chose lorsque je tente une approche différente de la création de la socket. Si j'utilise:

socket = new Socket();
socket.setSoTimeout(500);
socket.connect(new InetSocketAddress(address, port), 1000);

J'ai le même problème, mais avec le SocketTimeoutException à la place. Je reçois un

java.net.SocketTimeoutException: Lire timed out

si le port était ouvert mais il n'y avait pas de bannière à lire et

java.net.SocketTimeoutException: Connexion a expiré

si le serveur n'est pas en direct ou port est fermé.

Toutes les idées? Merci à l'avance!

Était-ce utile?

La solution

Je ne pense pas que vous avez des options que l'analyse du message d'exception. Y at-il une raison que vous préférez ne pas le faire?

Autres conseils

ConnectException ne dispose d'un constructeur vide et un constructeur de errorMesssage. Il n'y a pas de sous-classes ConnectException dans l'API. Je crains donc, Java ne fait pas bonne façon d'accéder à la raison. Parsing le message d'exception semble être la seule façon, malgré qu'il soit vraiment en désordre avec les traductions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top