Как прочитать запрос, используя CompletionHandlers и ByteBuffer меньше, чем запрос?

Я использую Java 7 иAsynchronousSocketChannel, Я хотел бы прочитать запрос (например,HTTP POST) но я изо всех сил пытаюсь найти хорошее решение, чтобы прочитать полный запрос, если он больше, чем размерByteBuffer Я использую. Например. еслиByteBuffer составляет 4048 байт, а HTTP POST содержит изображение размером более 4 КБ.

Есть ли хорошее рекурсивное решение или цикл для этого?

Вот мой код для запросов на чтение:

public void readRequest(final AsynchronousSocketChannel ch) {
    final ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
    final StringBuilder strBuilder = new StringBuilder();
    final CharsetDecoder decoder = Charset.forName("US-ASCII").newDecoder();

    ch.read(buffer, null, new CompletionHandler<Integer, Void>() {

        public void completed(Integer bytes, Void att) {

            buffer.flip();                          
            try {
                decoder.reset();
                strBuilder.append(decoder.decode(buffer).toString());
            } catch (CharacterCodingException e) {
                e.printStackTrace();
            }           
            buffer.clear();         

            // More data to read or send response
            if(bytes != -1) {

                // More data to read
                ch.read(...);

            } else {

                // Create and send a response

            }
        }

        public void failed(Throwable exc, Void att) {
            exc.printStackTrace();
        }

    });
}

И где я написал:

// More data to read
ch.read(...);

это выглядит как хорошее место для повторного использования кода, но я не могу придумать хорошее решение. Есть ли способ, которым я могу использовать CompletionHandler здесь? Любое предложение для чтения полного запроса с ограниченнымByteBuffer?

Я хотел бы решить эту проблему неблокирующим и асинхронным способом.

Ответы на вопрос(1)

Решение Вопроса

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

// More data to read
ch.read(buffer, null, this); //here you pass the same CompletionHandler you are using

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

Это документ, который говорит, чтобы избежать блокирования и долгоживущих операций внутриCompletionHandlerсмотрите на странице 33http://openjdk.java.net/projects/nio/presentations/TS-4222.pdf

 08 авг. 2016 г., 16:46
Таким образом, следуя этому совету, было бы плохой идеей вызывать метод accept AsynchronousServerSocketChannel из обработчика завершения?

Ваш ответ на вопрос