Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java选择器select()始终返回上次读取的键_Java_Selector_Nio - Fatal编程技术网

Java选择器select()始终返回上次读取的键

Java选择器select()始终返回上次读取的键,java,selector,nio,Java,Selector,Nio,我正在尝试编写一个TCP服务器来读取客户端发送的数据。我希望在读取之后保持客户端连接打开,以便能够读取任何后续发送的数据 我正在执行的代码如下: while(true) { try { int keysSelected = selector.select(); System.out.println("keysSelected = " + keysSelected); if (keysSelected

我正在尝试编写一个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);
            }
        }
    }
问候
Brian

在调用
flip()
并处理所获得的数据后,需要调用
compact()
。你从来没有这样做过,所以你在填充缓冲区,所以
read()
返回零,所以你在返回
select()
循环,但是套接字接收缓冲区中仍然有挂起的数据。

在调用
flip()
之后,你需要调用
compact()
,并处理你得到的数据。你从来没有这样做过,所以你在填充缓冲区,所以
read()
返回零,所以你返回到
select()
循环,但是套接字接收缓冲区中仍然有挂起的数据。

不幸的是,这似乎不能解决问题。尽管读取的结果始终为-1,但读取的键仍然始终返回?这意味着EOS,因此您应该关闭通道。不幸的是,这似乎无法解决问题。尽管读取的结果始终为-1?这意味着EOS,因此您应该关闭通道,但读取的键仍然始终返回。
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();
    }
}