Comment puis-je détecter l'état du serveur dans un scanner de port implémentation Java
-
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!
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.