Si no le molesta el puerto utilizado, especifique un puerto de 0 en ServerSocket constructor y escuchará en cualquier puerto libre.
ServerSocket s = new ServerSocket(0);
System.out.println("listening on port: " + s.getLocalPort());
Si desea utilizar un conjunto específico de puertos, la forma más fácil es probablemente recorrerlos hasta que funcione. Algo como esto:
public ServerSocket create(int[] ports) throws IOException {
for (int port : ports) {
try {
return new ServerSocket(port);
} catch (IOException ex) {
continue; // try next port
}
}
// if the program gets here, no port in the range was found
throw new IOException("no free port found");
}
Podría utilizarse como tal:
try {
ServerSocket s = create(new int[] { 3843, 4584, 4843 });
System.out.println("listening on port: " + s.getLocalPort());
} catch (IOException ex) {
System.err.println("no available ports");
}
Al usar el nuevo ServerSocket (0), ¡se debe tener cuidado para cerrarlo! Basado en http: // javasourcecode.org/html/open-source/eclipse/eclipse-3.5.2/org/eclipse/jdt/launching/SocketUtil.java.html, ligeramente adaptado en mi https://gist.github.com/3429822 – vorburger
@vorburger, doing de esa manera es propenso a las condiciones de carrera. Es mejor simplemente escuchar en el socket del servidor de inmediato, en lugar de abrirlo para encontrar un puerto libre, cerrarlo de nuevo, y luego abrir uno nuevamente en el puerto libre (para entonces hay una pequeña posibilidad de que algo más esté escuchando en ese momento). port.) –
estuvo de acuerdo, pero depende del caso de uso exacto: en mi caso necesitaba encontrar un número de puerto libre para entregarlo en alguna API (digamos un arrancador Jetty integrado, para pruebas) - la API respectiva quiere un número de socket - no un socket de servidor ya abierto. Entonces eso depende. – vorburger