我有以下代码:
Selector socketSelector = SelectorProvider.provider().openSelector();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.register(socketSelector, SelectionKey.OP_ACCEPT);
serverChannel.socket().bind(new InetSocketAddress(1331));
new Thread() {
@Override
public void run() {
try {
Thread.sleep(5000);
serverChannel.close();
} catch (InterruptedException | IOException ex) {
}
}
}.start();
注意:代码不完整,只是测试
此代码应打开连接端口 1331,运行 5 秒后应通过释放要使用的端口来关闭连接。但是,如果我使用这一行:
serverChannel.register(socketSelector, SelectionKey.OP_ACCEPT);
端口不放行,只有我去掉了,如果我去掉就不能接受客户。
我怎样才能找到一种无需关闭应用程序即可释放端口的方法?
最佳答案
使用 Selector
注册的
SelectableChannels
延迟关闭,仅在下次调用 select()
时生效。它记录在 Javadoc 中某个相当模糊的地方,当我需要它时我永远找不到。所以你需要调用 select()
一个短的超时时间,比如五秒,如果它返回零则什么也不做。或者,做任何可能出现的内务处理。
关于Java - 关闭 ServerSocketChannel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32726296/