Jak odczytać żądanie używając CompletionHandlers i ByteBuffera mniejszego niż żądanie?
Używam Java 7 iAsynchronousSocketChannel
. Chciałbym przeczytać prośbę (np.HTTP POST
), ale staram się znaleźć ładne rozwiązanie do przeczytania całego żądania, jeśli jest ono większe niż rozmiarByteBuffer
Używam. Na przykład. jeśliByteBuffer
wynosi 4048 bajtów, a HTTP POST zawiera obraz większy niż 4 kB.
Czy istnieje jakieś ładne rozwiązanie rekurencyjne lub pętla?
Oto mój kod do czytania żądań:
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();
}
});
}
A gdzie napisałem:
// More data to read
ch.read(...);
wygląda na dobre miejsce do ponownego użycia kodu, ale nie mogę wymyślić fajnego rozwiązania. Czy jest jakiś sposób, aby użyć tutaj CompletionHandler? Wszelkie sugestie dotyczące przeczytania pełnej prośby z ograniczonąByteBuffer
?
Chciałbym rozwiązać ten problem w sposób nieblokujący i asynchroniczny.