Как прочитать запрос, используя 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
?
Я хотел бы решить эту проблему неблокирующим и асинхронным способом.