Wie lese ich eine Anfrage mit CompletionHandlern und einem ByteBuffer, der kleiner als die Anfrage ist?

Ich benutze Java 7 undAsynchronousSocketChannel. Ich möchte eine Anfrage lesen (z.HTTP POST), aber ich habe Mühe, eine gute Lösung zu finden, um die vollständige Anfrage zu lesen, wenn sie größer ist als die Größe derByteBuffer Ich benutze. Z.B. wenn dasByteBuffer beträgt 4048 Byte und der HTTP-POST enthält ein Bild, das größer als 4 KB ist.

Gibt es dafür eine nette rekursive Lösung oder Schleife?

Hier ist mein Code zum Lesen von Anfragen:

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();
        }

    });
}

Und wo ich geschrieben habe:

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

Es sieht aus wie ein guter Ort für die Wiederverwendung von Code, aber ich kann keine gute Lösung finden. Kann ich den CompletionHandler hier auf irgendeine Weise wiederverwenden? Jeder Vorschlag zum Lesen einer vollständigen Anfrage mit einer eingeschränktenByteBuffer?

Ich möchte dies nicht blockierend und asynchron lösen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage