我有以下代码:
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);端口是不释放的,只有我移除了,如果我移除了就不能接受客户了。
我如何才能找到一种方法来释放端口,而不必关闭应用程序?
发布于 2015-09-23 07:56:00
使用Selector注册的SelectableChannels具有延迟关闭,这些延迟关闭仅在下次调用select()时生效。它被记录在Javadoc中一个相当模糊的地方,当我需要它的时候,我永远找不到它。因此,您需要在较短的超时时间内调用select(),例如5秒,如果返回0,则不执行任何操作。或者,做任何可能出现的内务。
https://stackoverflow.com/questions/32726296
复制相似问题