バインド解除と再バインドを試みるときに例外を回避するには、作成された各ソケットを再利用可能として設定します。そのためには、バインドされていないソケットを作成する必要があります。
DatagramSocket s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(someSocketAddress);
詳細:
http ://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setReuseAddress(boolean )
PS TCPを使用する場合のこのような状況でのBindExceptionの主な理由であるタイムアウト期間は、UDPソケットには適用されない場合がありますが、SO_REUSEを使用すると、とにかく即座に再バインドできます。
http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setReuseAddress(boolean)
次にいくつかの例を示します。
final int port = 55880;
A)再利用なし、クローズなし=アドレスはすでに使用されています
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)再利用、クローズなし=苦情なし
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)再利用なし、クローズ=苦情なし(データグラムソケットの場合のみ)
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();