我有以下代码:

 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);


该端口不会释放,只有在我删除后,并且在我删除后才能接受客户。

如何找到一种无需关闭应用程序即可释放端口的方法?

最佳答案

SelectableChannels注册的Selector已延迟关闭,仅在下次调用select()时才生效。它记录在Javadoc中相当晦涩的地方,我什么时候都找不到。因此,您需要在短时间内调用select(),例如说五秒钟,如果返回零则不执行任何操作。或者,做任何可能的内务处理。

关于java - Java-关闭ServerSocketChannel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32726296/

10-14 02:42