2011-10-20 6 views
5

En mi aplicación habrá un hilo que siempre se ejecutará y enviará o escuchará algún puerto.¿Cómo se configura la opción de dirección de reutilización para un socket de datagrama en código java?

Esta aplicación se ejecuta en segundo plano. Algunas veces, al crear el socket, descubrí que el puerto que antes usaba el mismo subproceso no se libera en close() del socket. Así que intenté así

 dc = new DatagramSocket(inetAddr); 
     dc.setReuseAddress(true); 

El problema es que no está llegando a la segunda línea también. en la primera línea en sí estoy recibiendo la expceción BindException: Address already in use.

¿Alguien puede por favor ayudarme a manejar esta situación?

¿Hay alguna forma de liberar el puerto?

, gracias & Saludos,
SSuman185

+0

vistazo a mi respuesta editado. Gracias. – user370305

Respuesta

6

Utilice un MulticastSocket. Constrúyalo sin argumentos. Eso llama implícitamente a setReuseAddress (verdadero). A continuación, llame a bind().

En este momento está llamando a setReuseAddress() demasiado tarde para que le sirva de algo.

+0

+1, para compartir su respuesta. – user370305

+0

Intenté esto, ¿pero tengo una duda? Observé que cuando creo DatagramSocket() sin parámetros, su obtención se vincula a algún número de puerto libre. Después de configurar la dirección de reutilización y vincular, se vinculará al nuevo puerto. ¿Qué pasa con el viejo puerto? – Suman

+0

@ SSuman185 correcto, bien descubierto. Tienes que crear un MulticastSocket. Puede usarlo igual que un DatagramSocket, cuyo constructor predeterminado fue mal diseñado hace unos 15 años. – EJP

11

DatagramSocket(inetAddr) se une al puerto. Necesitas setReuseAddress(true) ANTES de vincular.

Para hacer esto ... utilizar lo siguiente:

dc = new DatagramSocket(null); 
dc.setReuseAddress(true); 
dc.bind(inetAddr); 

Este constructor abandona el puerto no unido.

+0

y inetAddr aquí representa? !! –

0

Ésta es la forma en que trabajó para mí:

try { 
     clientMulticastSocket = new MulticastSocket(null); 
     clientMulticastSocket.setReuseAddress(true); 
     clientMulticastSocket.bind(new InetSocketAddress(multicastHostAddress, multicastPort)); 
     clientMulticastSocket.joinGroup(multicastHostAddress); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
Cuestiones relacionadas