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();
Avete controllato quanto segue: 1. la porta 9999 è gratuita su IP2, 2. IP2 è pingable 3. avete le autorizzazioni per accedere a IP2. – NiranjanBhat