私はJava7とを使用していますAsynchronousSocketChannel
。リクエスト(例HTTP POST
)を読みたいのですが、使用しているサイズよりも大きい場合は、リクエスト全体を読むための優れた解決策を見つけるのに苦労していByteBuffer
ます。たとえば、ByteBuffer
が4048バイトで、HTTPPOSTに4kBより大きい画像が含まれている場合。
このための優れた再帰的ソリューションまたはループはありますか?
リクエストを読み取るための私のコードは次のとおりです。
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
ますか?
これをノンブロッキングで非同期の方法で解決したいと思います。