2010-05-05 11 views
1

Je vous écris un scanner de port en Java et je veux être en mesure de distinct les 4 cas d'utilisation suivants:Comment puis-je détecter l'état du serveur dans un scanner de port implémentation java

    Port
  • est ouvert
  • Port est ouvert bannière et le serveur a été lu
  • le port est fermé
  • serveur
  • ne vit

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 autre message d'exception:

java.net.ConnectException: Connection timed out: connecter

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

java.net.ConnectException: Connection refused: connecter

lorsque le port a été fermé

je ne peux pas faire la distinction entre les deux cas d'utilisation sans creuser dans le message d'exception réelle. La même chose se produit lorsque j'essaie une approche différente pour la création de 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 a expiré

si le port était ouvert mais il n'y avait pas de bannière pour être lu et

java.net.SocketTimeoutException: connect a expiré

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

Des idées? Merci d'avance!

Répondre

1

Je ne pense pas que vous ayez d'autres options que l'analyse du message d'exception. Y a-t-il une raison pour laquelle vous préférez ne pas le faire?

+0

Je pense que c'est un peu "sale" de compter sur le message String pour décider de ce qui se passe donc je préfère ne pas y aller. Je me demandais juste s'il y avait une autre option que je ne connaissais pas. –

0

ConnectException a seulement un constructeur vide et un constructeur errorMesssage. Il n'y a aucune sous-classe de ConnectException dans l'API. J'ai donc peur, Java ne permet pas d'accéder à la raison. L'analyse du message d'exception semble être le seul moyen, même s'il est vraiment désordonné avec les traductions.