尝试使用DatagramChanned它很好,但它在关闭它之后仍然绑定地址,并且函数完成执行,如下例所示。
为什么要打印此代码:
致电号码:2
java.net.BindException:已在使用的地址:bind
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
recever(1);
recever(2);
}
});
}
static void recever(int c) {
try {
DatagramChannel chdata = DatagramChannel.open();
int uport = 3111;
int bufsize = 10;
chdata.configureBlocking(false);
Selector selector = Selector.open();
chdata.bind(new InetSocketAddress(uport));
ByteBuffer bytbuf = ByteBuffer.allocate(bufsize);
chdata.register(selector, SelectionKey.OP_READ);
int th = 0;
int sn;
while (true) {
if (selector.select(1000) == 0){
System.out.println("\nTimeout");
break;
}
Set readyKeys = selector.selectedKeys();
Iterator iterator = readyKeys.iterator();
while (iterator.hasNext()) {
iterator.next();
iterator.remove();
bytbuf.clear();
chdata.receive(bytbuf);
th++;
bytbuf.flip();
// dealwithincomingbuffer(bytbuf);
}
}
// chdata.bind(null);
chdata.close();
} catch (IOException ex) {
System.out.println("Call num: "+c+" \n "+ex);
}
}
}
答案 0 :(得分:1)
类似的问题:DatagramChannel.close() keeps port open on Windows
我认为你应该在那里找到答案
答案 1 :(得分:0)
您没有在finally块中关闭套接字,并且您根本没有关闭Selector。因此,有些情况下套接字根本没有关闭。