在我的应用程序中,我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
任何见解都会非常有用。
答案 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);