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

时间:2012-04-09 09:07:28

标签: 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);

但这给出了

java,net,BindException :Address already in use : Cannot bind

任何见解都会非常有用。

2 个答案:

答案 0 :(得分:9)

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

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

P.S。在这种情况下,使用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();

答案 1 :(得分:0)

非常重要-也许有些用户错过了这一点:

DatagramSocket s = new DatagramSocket();

不起作用

上面示例中的正确行可以正常工作:

DatagramSocket s = new DatagramSocket(null);