Java Selector select()始终返回最后一个读取密钥

时间:2010-06-27 21:14:03

标签: java selector nio

我正在尝试编写一个读取客户端发送的数据的TCP服务器。我希望在读取后保持客户端连接打开,以便能够读取任何后续发送的数据。

我正在执行的代码如下:

    while(true) {
        try {
            int keysSelected = selector.select();

            System.out.println("keysSelected = " + keysSelected);
            if (keysSelected < 1) {
                continue;                    
            }
        } catch (IOException e) {
            e.printStackTrace();
            break;
        }


        Iterator<SelectionKey> keyIterator = selector.selectedKeys().iterator();

        while(keyIterator.hasNext()) {
            SelectionKey key = keyIterator.next();
            keyIterator.remove();

            if (key.isAcceptable()) {
                processAcceptRequest(selector, key);
            } else if (key.isReadable()) {
                processQueryRequest(key);
            }
        }
    }

我遇到的问题是,在任何客户端连接之前,选择器块上的select调用。在第一个客户端连接并将数据写入服务器后,即使没有要读取的数据,select也会连续返回OP_READ键?我做错了什么?

读取的代码是:

private void processQueryRequest(SelectionKey key) {
    ByteBuffer byteBuffer = ByteBuffer.allocate(32);

    SocketChannel clientChannel = (SocketChannel) key.channel();

    try {
        byteBuffer.clear();

        while(clientChannel.read(byteBuffer) > 0) {
            byteBuffer.flip();

            Charset charset = Charset.forName("UTF-8");
            CharBuffer charBuffer = charset.decode(byteBuffer);

            System.out.println(charBuffer.toString());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

此致 布赖恩

1 个答案:

答案 0 :(得分:0)

致电compact()后,您需要致电flip()并处理您获得的数据。你永远不会这样做,所以你正在填充缓冲区,所以read()返回零,所以你返回select()循环,但是套接字接收缓冲区中仍有未决数据。