2012-04-09 1 views
6

Nella mia applicazione ho creato una presa di datagarm e ho associato una porta diciamo 9999 a ip 192.168.173.1 ora voglio associare la porta a un nuovo IP diciamo 192.168.173.2 ma Io non sono in grado di farlo Passi ho seguitoCollegamento di una porta alla presa di un datagramma su un IP diverso

1 DatagramSocket s= new DatagramSocket(port,ip1); 
2 s.disconnect(); 

s.close(); 

s= new DatagramSocket(port,ip2); 

ma questo dà una

java,net,BindException :Address already in use : Cannot bind 

Tutta la comprensione sarebbe molto utile.

+0

Avete controllato quanto segue: 1. la porta 9999 è gratuita su IP2, 2. IP2 è pingable 3. avete le autorizzazioni per accedere a IP2. – NiranjanBhat

risposta

7

Per evitare eccezioni quando si tenta di separare e reindirizzare, impostare ogni socket creato come riutilizzabile. Per fare ciò, è necessario creare una presa non legato:

DatagramSocket s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(someSocketAddress); 

Maggiori informazioni: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setReuseAddress(boolean)

P.S. Il periodo di timeout che è il motivo principale per un BindException in tali circostanze quando si utilizza un TCP potrebbe non essere applicabile ai socket UDP, ma SO_REUSE dovrebbe consentire comunque di eseguire nuovamente il binding all'istante. http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setReuseAddress(boolean)

Ecco alcuni esempi:

final int port = 55880; 

A) No riutilizzo, no chiudere = Indirizzo già in uso

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 

s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("localhost", port)); 

B) riutilizzo, senza chiudere = lamentele

DatagramSocket s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 

s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("localhost", port)); 

C) Nessun riutilizzo, chiuso = nessun reclamo (per socket di datagramma o n.)

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 
s.close(); 

s = new DatagramSocket(null); 
s.bind(new InetSocketAddress("localhost", port)); 
s.close(); 
+0

Non ha funzionato ho impostato il riutilizzo del socket come vero ma la stessa eccezione rientra nuovamente – cornercoder

+0

Se tutti i socket che si collegano a quella porta specifica sono riutilizzabili, non è possibile ottenere un'eccezione di binding. – afk5min

+0

c'è solo una porta e sto ottenendo un'eccezione – cornercoder