我使用的Java 7和AsynchronousSocketChannel
。 我想读的请求(例如HTTP POST
),但我在努力拿出一个很好的解决方案,以阅读完整的请求时,如果它比规模更大ByteBuffer
我使用。 例如,如果ByteBuffer
是4048个字节,并且HTTP POST中包含的图像是大于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
?
我想在一个非阻塞和异步的方式来解决这个问题。