将端口重新绑定到差异IP上的数据报套接字

cor*_*der 6 java network-programming

在我的应用程序中,我hyave创建了一个datagarm套接字并绑定了一个端口说9999到ip 192.168.173.1现在我想将端口绑定到一个新的IP说192.168.173.2但是我无法做到这一步我遵循的步骤

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

s.close();

s= new DatagramSocket(port,ip2);
Run Code Online (Sandbox Code Playgroud)

但这给了一个

java,net,BindException :Address already in use : Cannot bind
Run Code Online (Sandbox Code Playgroud)

任何见解都会非常有帮助.

afk*_*min 9

为了避免在尝试取消绑定和重新绑定时出现异常,您可以将每个创建的套接字设置为可重用.为此,您必须创建一个未绑定的套接字:

DatagramSocket s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(someSocketAddress);
Run Code Online (Sandbox Code Playgroud)

更多信息: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;
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)