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!
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. –