Выбор NIO Java () возвращается без выбранных ключей - почему?

Попробуйте заменить это:

int messageLength = reader.read(buffer, 0, READ_BUFFER);

На это:

int messageLength = reader.read(buffer, 0, buffer.Length);
7
задан Frank Taylor 15 October 2008 в 09:46
поделиться

1 ответ

Короткий ответ: удалить OP_CONNECT из списка операций Вы интересуетесь для принятого соединения - принятое соединение уже соединено.

Мне удалось воспроизвести проблему, которая могла бы быть точно, что происходит с Вами:

import java.net.*;
import java.nio.channels.*;


public class MyNioServer {
  public static void main(String[] params) throws Exception {
    final ServerSocketChannel serverChannel = ServerSocketChannel.open();
    serverChannel.configureBlocking(true);
    serverChannel.socket().bind(new InetSocketAddress("localhost", 12345));
    System.out.println("Listening for incoming connections");
    final SocketChannel clientChannel = serverChannel.accept();
    System.out.println("Accepted connection: " + clientChannel);


    final Selector selector = Selector.open();
    clientChannel.configureBlocking(false);
    final SelectionKey clientKey = clientChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_CONNECT);
    System.out.println("Selecting...");
    System.out.println(selector.select());
    System.out.println(selector.selectedKeys().size());
    System.out.println(clientKey.readyOps());
  }
}

После того, как вышеупомянутый сервер получает соединение, самое первое select() на выходах соединения, не блокируясь и нет никаких ключей с готовыми операциями. Я не знаю, почему Java ведет себя таким образом, но кажется, что многие люди укушены этим поведением.

Результатом является то же на JVM Sun 1.5.0_06 на Windows XP, а также JVM Sun 1.5.0_05 и 1.4.2_04 на Linux 2.6.

9
ответ дан 6 December 2019 в 10:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: