为避免在尝试解除绑定和重新绑定时出现异常,您可以将每个创建的套接字设置为可重用。为此,您必须创建一个未绑定的套接字:
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();