Попробуйте заменить это:
int messageLength = reader.read(buffer, 0, READ_BUFFER);
На это:
int messageLength = reader.read(buffer, 0, buffer.Length);
Короткий ответ: удалить 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.