Como ler uma solicitação usando o CompletionHandlers e um ByteBuffer menor que a solicitação?
Eu estou usando o Java 7 eAsynchronousSocketChannel
. Gostaria de ler uma solicitação (por exemplo,HTTP POST
) mas estou com dificuldades para encontrar uma boa solução para ler o pedido completo, se for maior que o tamanho doByteBuffer
Estou a usar. Por exemplo. se oByteBuffer
é 4048 bytes e o HTTP POST contém uma imagem maior que 4kB.
Existe alguma solução recursiva legal ou loop para isso?
Aqui está o meu código para solicitações de leitura:
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();
}
});
}
E onde eu escrevi:
// More data to read
ch.read(...);
parece um bom lugar para reutilização de código, mas não consigo encontrar uma boa solução. Existe alguma maneira que eu possa reutilizar o CompletionHandler aqui? Qualquer sugestão para ler um pedido completo com um limiteByteBuffer
?
Eu gostaria de resolver isso de uma maneira não-bloqueante e assíncrona.