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)
任何见解都会非常有帮助.
为了避免在尝试取消绑定和重新绑定时出现异常,您可以将每个创建的套接字设置为可重用.为此,您必须创建一个未绑定的套接字:
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)
| 归档时间: |
|
| 查看次数: |
7865 次 |
| 最近记录: |