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. A este respecto tengo dos preguntas.
¿En qué rango de números de puerto debo buscar? (Usé los puertos 12345, 12346 y 12347 y estuvo bien).
¿Cómo puedo saber si un puerto determinado no está ocupado por otro software?
java
networking
sockets
port
romano
fuente
fuente
ssh -D 127.0.0.0:0 ...
¡No!), Lo cual es realmente frustrante. Tuvimos que parchear un buen número de bibliotecas / programas para que fueran útiles para nosotros.new ServerSocket(0)
No es diferente a este respecto. No hay nada en su primer enlace sobre esto. Su segundo enlace simplemente muestra malas prácticas. Una vez que haya construido elServerSocket
, debe usarlo , no cerrarlo e intentar reutilizar el mismo número de puerto. Todo eso es una pérdida de tiempo completa, además de ser vulnerable a los problemas de la ventana de tiempo.Si pasa 0 como número de puerto al constructor de ServerSocket, le asignará un puerto.
fuente
A partir de Java 1.7, puede usar probar con recursos como este:
Si necesita encontrar un puerto abierto en una interfaz específica, consulte la documentación de ServerSocket para buscar 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 unirse al mismo puerto inmediatamente después de cerrar la instancia de ServerSocket.
fuente
SO_REUSEADDR
. Y hay una condición de carrera, pero es difícil solucionarlo.ServerSocket
con el mismo número de puerto, ya que podría haberse tomado mientras tanto. Por qué no solo devolverías lo real enServerSocket
lugar de cerrarlo sigue siendo un misterio.ServerSocket
lugar de unint
para el puerto.De acuerdo a Wikipedia , se debe utilizar puertos
49152
a65535
si que no es necesario un puerto 'conocida'.AFAIK, la única forma de determinar si un puerto está en uso es intentar abrirlo.
fuente
Si necesita en el rango de uso:
fuente
ServerSockets
en el caso de éxito, y no sufre los problemas de ventana de tiempo de este código.Si usa Spring, puede probar http://docs.spring.io/spring/docs/4.0.5.RELEASE/javadoc-api/org/springframework/util/SocketUtils.html#findAvailableTcpPort--
fuente
SpringUtils.findAvailableTcpPort()
está haciendo exactamente lo mismo recomendado en otras respuestas: elija un puerto y luego intentenew ServerSocket(port)
.El SDK de Eclipse contiene una clase SocketUtil , que hace lo que desea. Puede echar un vistazo al código fuente de git .
fuente
Ver http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#ServerSocket%28int%29
fuente
Esto funciona para mí en Java 6
fuente
Recientemente he lanzado una pequeña biblioteca para hacer precisamente eso con las pruebas en mente. La dependencia de Maven es:
Una vez instalado, se pueden obtener números de puerto libres a través de:
fuente
Si su servidor se inicia, entonces ese socket no se usó.
EDITAR
Algo como:
fuente
new ServerSocket(0)
no funciona para usted, la alternativa es esta. Creo que hay un 85% de posibilidades de que termines usando mi sugerencia.ServerSockets
para siempre y solo retiene el último que tuvo éxito. Necesita unabreak
declaración.Si desea crear su propio servidor utilizando un
ServerSocket
, puede hacer que elija un puerto libre para usted:Otras implementaciones de servidor suelen tener un soporte similar. Jetty, por ejemplo, elige un puerto libre a menos que lo configure explícitamente:
fuente
Puede que no lo ayude mucho, pero en mi máquina (Ubuntu) tengo un archivo / etc / services en el que se proporcionan al menos los puertos utilizados / 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 usarlas 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 los números de puerto asignados de IANA .
fuente
Si está utilizando Spring, la respuesta proporcionada por Michail Nikolaev es la más simple y limpia, y la OMI debe ser votada. Solo por conveniencia, agregaré un ejemplo en línea usando el método Springframwework SocketUtils .findAvailableTcpPort () :
int randomAvailablePort = SocketUtils.findAvailableTcpPort();
Es tan fácil como eso, solo una línea :). Por supuesto, la clase Utils ofrece muchos otros métodos interesantes, sugiero echar un vistazo a los documentos.
fuente
Usando la clase 'ServerSocket' podemos identificar si el puerto dado está en uso o libre. ServerSocket proporciona un constructor que toma un número entero (que es el número de puerto) como argumento e inicializa el socket del servidor en el puerto. Si ServerSocket arroja alguna excepción de E / S, entonces podemos suponer que este puerto ya está en uso.
El siguiente fragmento se utiliza para obtener todos los puertos disponibles.
Referencia enlace .
fuente
Si el puerto está ocupado por otro software, el código arrojará una IOException
fuente