2010-02-09 15 views
7

En Java, necesito obtener un número de puerto para la comunicación entre varias instancias del mismo programa. Ahora, simplemente podría elegir un número fijo e ir con él. Pero me pregunto si hay una forma de elegir dinámicamente el número de puerto, para no tener que molestar a mis usuarios con el establecimiento del número de puerto.¿Elige dinámicamente el número de puerto?

Aquí hay una idea que tuve, que funciona así:

  • Hay una A. Programa
  • aperturas 'MyApp', fija el número de puerto inicial trata de agarrar el puerto A.
  • Si tiene éxito , entonces es la primera instancia de 'MyApp'. Hecho.
  • Si falla, pregunta por el puerto A si el programa en A es una instancia de 'MyApp'. Si es así, comuníquese con esa instancia. Hecho. Si no, intente agarrar el puerto A + 1. Y si hay otro programa que usa ese puerto (tampoco una instancia de 'MyApp'), entonces tome A + 2, luego A + 3, y así sucesivamente.

¿Tiene sentido esta estrategia? ¿O hay una mejor manera de elegir dinámicamente un número de puerto?

+1

No es necesario que lo haga. Si crea un socket, el sistema automáticamente le asignará el siguiente número de puerto disponible. Lea detenidamente la documentación de la API de socket que está utilizando. También proporcione más etiquetas en el lenguaje de programación/biblioteca que está utilizando. –

+0

@dma_k: en Java, aparentemente tiene que vincularse al puerto 0 para lograr eso (contra-intuitivo, lo sé). Si no lo haces, no podrás escucharlo. :-P –

+0

Prácticamente toda la implementación de socket que puedo recordar utiliza este truco "contraintuitivo" para pedir un puerto asignado dinámicamente ... nada tan especial aquí. – jldupont

Respuesta

26

Si se une al puerto 0, Java utilizará un puerto generado por el sistema. :-) Entonces, esa es probablemente la forma más fácil de retroceder si su puerto deseado ya está siendo utilizado.

ServerSocket s = new ServerSocket(0); 
int port = s.getLocalPort(); // returns the port the system selected 
+2

... y ¿cómo se encontrarán las instancias? ¿No es eso de lo que se trata la pregunta? – jldupont

3

Tomaría la inversa y seleccionaría un puerto alto fijo para su aplicación. Conviértalo en un valor de configuración para poder cambiarlo si es necesario. Esto simplificará la configuración ya que muchas veces los usuarios de aplicaciones necesitan solicitar operaciones de red para abrir puertos. Trabajo en torno a los valores asignados IANA:

http://www.iana.org/assignments/port-numbers

puertos de exploración podrían convertir su aplicación en un mal ciudadano para muchos sistemas de detección de intrusos.

1

Puede usar Bonjour/ZeroConf para publicitar los servicios de cada instancia y permitir que una instancia encuentre las otras. Piense en esto como un servicio de directorio que podría ayudarlo a administrar el espacio de nombres de su puerto.

Cada instancia solo puede tomar un puerto asignado dinámicamente en este caso. Una solicitud de enlace al puerto "0" generalmente instruirá al sistema para que asigne un puerto dinámico.

Cuestiones relacionadas