To avoid exceptions when trying to decouple and reconfigure, you must set each socket created as reusable. To do this, you MUST create an unbound socket:
DatagramSocket s = new DatagramSocket(null); s.setReuseAddress(true); s.bind(someSocketAddress);
Additional information: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setReuseAddress(boolean )
PS The timeout period, which is the main reason for a BindException in such circumstances when using TCP, may not apply to UDP sockets, but SO_REUSE should allow you to instantly overwrite. http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setReuseAddress(boolean )
Here are some examples:
final int port = 55880;
A) No reuse, no close = Address already in use
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) Reuse, no closure = no complaints
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) No reuse, close = no complaints (only for sockets for datagrams)
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();
source share