6

在我的应用程序中,我创建了一个 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

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

4

2 回答 2

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 )

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();
于 2012-04-09T09:55:48.347 回答
0

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

DatagramSocket s = new DatagramSocket();

不工作

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

DatagramSocket s = new DatagramSocket(null);
于 2019-02-08T14:43:27.740 回答