Java - 关闭 ServerSocketChannel

标签 java

我有以下代码:

 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/

相关文章:

java - Apache Lucene 一对多查询

java - 是否可以使用泛型但需要特定的父类型?

java - 从 JDBC 连接处理 Sybase 中的登录错误的正确方法是什么?

java.lang.ClassNotFoundException : org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory

java - 向 child 添加appendChild时遇到问题

java - 在 tomcat 中重新部署新版本的 .war 时更改属性值

java - 如何将 JAXB 生成的集合中的 addAll() 项添加到简单的 ArrayList 中?

java - 如何将-Dflag发送到android应用程序

java - 异常 + 迭代器结束信号 : why is it bad in Java and normal in Python?

java - Android 新手 - 了解 OutputStreamWriter 在 Web 服务调用中的使用