Comment déterminer par programme la disponibilité d'un port sur une machine donnée à l'aide de Java?
c'est-à-dire à partir d'un numéro de port, déterminez s'il est déjà utilisé ou non?.
Comment déterminer par programme la disponibilité d'un port sur une machine donnée à l'aide de Java?
c'est-à-dire à partir d'un numéro de port, déterminez s'il est déjà utilisé ou non?.
Voici l' implémentation issue du projet Apache Camel :
/**
* Checks to see if a specific port is available.
*
* @param port the port to check for availability
*/
public static boolean available(int port) {
if (port < MIN_PORT_NUMBER || port > MAX_PORT_NUMBER) {
throw new IllegalArgumentException("Invalid start port: " + port);
}
ServerSocket ss = null;
DatagramSocket ds = null;
try {
ss = new ServerSocket(port);
ss.setReuseAddress(true);
ds = new DatagramSocket(port);
ds.setReuseAddress(true);
return true;
} catch (IOException e) {
} finally {
if (ds != null) {
ds.close();
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
/* should not be thrown */
}
}
}
return false;
}
Ils vérifient également le DatagramSocket pour vérifier si le port est disponible en UDP et TCP.
J'espère que cela t'aides.
Il semble qu'à partir de Java 7, la réponse de David Santamaria ne fonctionne plus de manière fiable. Il semble toutefois que vous pouvez toujours utiliser un Socket de manière fiable pour tester la connexion.
private static boolean available(int port) {
System.out.println("--------------Testing port " + port);
Socket s = null;
try {
s = new Socket("localhost", port);
// If the code makes it this far without an exception it means
// something is using the port and has responded.
System.out.println("--------------Port " + port + " is not available");
return false;
} catch (IOException e) {
System.out.println("--------------Port " + port + " is available");
return true;
} finally {
if( s != null){
try {
s.close();
} catch (IOException e) {
throw new RuntimeException("You should handle this error." , e);
}
}
}
}
Si vous n'êtes pas trop préoccupé par les performances, vous pouvez toujours essayer d'écouter sur un port à l'aide de la classe ServerSocket . S'il y a une exception, il y a de fortes chances qu'il soit utilisé.
boolean portTaken = false;
ServerSocket socket = null;
try {
socket = new ServerSocket(_port);
} catch (IOException e) {
portTaken = true;
} finally {
if (socket != null)
try {
socket.close();
} catch (IOException e) { /* e.printStackTrace(); */ }
}
EDIT: Si vous essayez uniquement de sélectionner un port libre, new SocketServer(0)
en trouvera un pour vous.
Les solutions basées sur les sockets try / catch peuvent ne pas donner des résultats précis (l’adresse du socket est "localhost" et dans certains cas, le port peut être "occupé" et non par l’interface de bouclage et au moins sous Windows, ce test a échoué, c’est-à-dire le prot faussement déclaré comme disponible).
Il y a une bonne bibliothèque appelée SIGAR , le code suivant peut vous connecter:
Sigar sigar = new Sigar();
int flags = NetFlags.CONN_TCP | NetFlags.CONN_SERVER | NetFlags.CONN_CLIENT; NetConnection[] netConnectionList = sigar.getNetConnectionList(flags);
for (NetConnection netConnection : netConnectionList) {
if ( netConnection.getLocalPort() == port )
return false;
}
return true;
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.