2011-10-20 8 views
5

Nella mia applicazione ci sarà un thread che sarà sempre in esecuzione e invierà o ascolterà alcune porte.Come impostare l'opzione di riutilizzo dell'indirizzo per un socket di datagramma nel codice java?

Questa applicazione viene eseguita in background. A volte durante la creazione del socket, ho trovato che la porta che era stata usata prima dalla stessa discussione, non viene rilasciata su close() del socket. Così ho provato in questo modo

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

Il problema è che non si raggiunge anche la seconda riga. nella prima riga stessa sto ricevendo l'expcetion BindException: Address already in use.

Qualcuno può aiutarmi a gestire questa situazione?

C'è un modo per rilasciare la porta?

Grazie & Saluti,
SSuman185

+0

un'occhiata alla mia risposta modificato. Grazie. – user370305

risposta

6

Utilizzare un MulticastSocket. Costruisci senza argomenti. Questo chiama implicitamente setReuseAddress (true). Quindi chiama bind().

Al momento si sta chiamando setReuseAddress() troppo tardi per fare qualcosa di buono.

+0

+1, per condividere la tua risposta. – user370305

+0

Ho provato questo, ma ho un dubbio? Ho osservato che quando creo DatagramSocket() con i parametri out, viene associato a un numero di porta libera. Dopo aver impostato l'indirizzo di riutilizzo e il binding, si collegherà alla nuova porta. Cosa succede al vecchio porto? – Suman

+0

@ SSuman185 corretto, ben individuato. Devi creare un MulticastSocket. Si può usare allo stesso modo di un DatagramSocket, il cui costruttore predefinito è stato progettato male circa 15 anni fa. – EJP

11

DatagramSocket(inetAddr) si lega al porto. È necessario setReuseAddress(true) PRIMA di legare.

Per ... utilizzare il seguente:

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

Questo costruttore lascia il porto non legato.

+0

e inetAddr qui rappresenta? !! –

0

Questo è come ha funzionato per me:

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