gpt4 book ai didi

java - 为什么当我尝试 telnet 时 select 方法立即返回 0?

转载 作者:行者123 更新时间:2023-12-02 09:50:00 24 4
gpt4 key购买 nike

我对 Java Nio 不熟悉。我尝试编写一个像这样的小演示:

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(9999)).configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

for (; ; ) {
int select = selector.select(2_000);
if (select == 0) {
System.out.println("no event");
continue;
}
System.out.println("select = " + select);
}

超时设置为 2 秒,程序每 2 秒打印一次“无事件”。

但是当我尝试远程登录它时,它开始非常快地打印“无事件”。看起来 select 方法返回值 0 而没有被阻止。

为什么?这是第一个问题。

当我尝试在 for 循环中添加一些逻辑时,如下所示:

for (; ; ) {
int select = selector.select();
if (select == 0) {
System.out.println("no event");
continue;
}
System.out.println("select = " + select);
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
System.out.println("iterator = " + iterator.hasNext());
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
}
}

然后我再次telnet它,select方法返回1。

为什么?这是第二个问题。

第一次在这里提问。请原谅我糟糕的英语。

最佳答案

您在 select(long) 中提供的数字与 Thread.sleep(long) 不同。根据:

https://docs.oracle.com/javase/7/docs/api/java/nio/channels/Selector.html#select(long)

select 是一个阻塞操作,但一旦能够选择 channel 就会继续进行。所以,当你连接上时,它会不断循环并输出。您提供的 long 值是告诉 select(long) 方法何时放弃尝试选择 channel ,而不是 hibernate 线程。为了保证至少2秒的 sleep ,需要在循环结束之前添加Thread.sleep(2000)。

关于返回值,select()返回更新的键的数量,可能为零。当您再次使用 telnet 连接时,您将提供一个可以更新的新 key 。如果您只有一个连接,则无需选择新的 channel 来收听。因此,没有任何内容被切换。如果您有两个连接,则每次都会修改其中一个连接是有意义的。

关于java - 为什么当我尝试 telnet 时 select 方法立即返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56387622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com