java - móviles - manual de programacion android pdf
¿Cómo encontrar un puerto disponible? (13)
Quiero iniciar un servidor que escuche un puerto. Puedo especificar el puerto explícitamente y funciona. Pero me gustaría encontrar un puerto de forma automática. En este sentido, tengo dos preguntas.
¿En qué rango de números de puerto debería buscar? (Utilicé los puertos 12345, 12346 y 12347 y estuvo bien).
¿Cómo puedo averiguar si un puerto determinado no está ocupado por otro software?
A partir de Java 1.7 puede usar try-with-resources como este:
private Integer findRandomOpenPortOnAllLocalInterfaces() throws IOException {
try (
ServerSocket socket = new ServerSocket(0);
) {
return socket.getLocalPort();
}
}
Si necesita encontrar un puerto abierto en una interfaz específica, consulte la documentación de ServerSocket para constructores alternativos.
Advertencia: Cualquier código que use el número de puerto devuelto por este método está sujeto a una condición de carrera: un proceso / subproceso diferente puede vincularse al mismo puerto inmediatamente después de cerrar la instancia de ServerSocket.
El Eclipse SDK contiene una clase SocketUtil , que hace lo que quiere. Puede echarle un vistazo al código fuente de git.
Esto funciona para mí en Java 6
ServerSocket serverSocket = new ServerSocket(0);
System.out.println("listening on port " + serverSocket.getLocalPort());
Puede que no te ayude demasiado, pero en mi máquina (Ubuntu) tengo un archivo / etc / services en el que se dan al menos los puertos usados / reservados por algunas de las aplicaciones. Estos son los puertos estándar para esas aplicaciones.
No hay garantías de que se estén ejecutando, solo los puertos predeterminados que usan estas aplicaciones (por lo que no debe usarlos si es posible).
Hay un poco más de 500 puertos definidos, aproximadamente la mitad de UDP y la mitad de TCP.
Los archivos se crean utilizando información de IANA, consulte Números de puerto asignados por IANA .
Recientemente he lanzado una pequeña biblioteca para hacer precisamente eso con pruebas en mente. La dependencia de Maven es:
<dependency>
<groupId>me.alexpanov</groupId>
<artifactId>free-port-finder</artifactId>
<version>1.0</version>
</dependency>
Una vez instalado, los números de puerto gratuitos se pueden obtener a través de:
int port = FreePortFinder.findFreeLocalPort();
Según Wikipedia , debe usar los puertos 49152
a 65535
si no necesita un puerto ''conocido''.
AFAIK la única forma de determinar si un puerto está en uso es tratar de abrirlo.
Si desea crear su propio servidor utilizando ServerSocket
, puede hacer que elija un puerto libre para usted:
ServerSocket serverSocket = new ServerSocket(0);
int port = serverSocket.getLocalPort();
Otras implementaciones de servidor suelen tener un soporte similar. Jetty, por ejemplo, elige un puerto libre a menos que lo establezcas explícitamente:
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
// don''t call: connector.setPort(port);
server.addConnector(connector);
server.start();
int port = connector.getLocalPort();
Si necesita el uso del rango :
public int nextFreePort(int from, int to) {
int port = randPort(from, to);
while (true) {
if (isLocalPortFree(port)) {
return port;
} else {
port = ThreadLocalRandom.current().nextInt(from, to);
}
}
}
private boolean isLocalPortFree(int port) {
try {
new ServerSocket(port).close();
return true;
} catch (IOException e) {
return false;
}
}
Si no le importa el puerto utilizado, especifique un puerto de 0 para el constructor ServerSocket y lo 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, probablemente la forma más fácil sea 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 usarse así:
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");
}
Si pasa 0 como el número de puerto al constructor de ServerSocket, asignará un puerto para usted.
Si su servidor se inicia, entonces ese socket no fue utilizado.
EDITAR
Algo como:
ServerSocket s = null ;
try {
s = new ServerSocket( 0 );
} catch( IOException ioe ){
for( int i = START; i < END ; i++ ) try {
s = new ServerSocket( i );
} catch( IOException ioe ){}
}
// At this point if s is null we are helpless
if( s == null ) {
throw new IOException(
Strings.format("Unable to open server in port range(%d-%d)",START,END));
}
Ver http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#ServerSocket%28int%29
Crea un socket de servidor, vinculado al puerto especificado. Un puerto de 0 crea un socket en cualquier puerto libre.