簡體   English   中英

Java Selector select()始終返回上一個讀取鍵

[英]Java Selector select() always returns the last read key

我正在嘗試編寫一個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();
    }
}

問候布萊恩

調用flip()並處理獲取的數據后,需要調用compact() 您從來沒有這樣做,所以您正在填充緩沖區,因此read()返回零,因此您將返回到select()循環,但是套接字接收緩沖區中仍然有未決數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM