我正在使用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 CompletionHandlerFailed(Throwable exc,Void att) {
exc.printStackTrace();
}
});
}
我写的地方:
// More data to read
ch.read(...);
它看起来是代码重用的好地方,但我无法想出一个很好的解决方案.有什么方法可以在这里重用CompletionHandler吗?有关使用有限的ByteBuffer阅读完整请求的任何建议?
我想以非阻塞和异步方式解决这个问题.
最佳答案
在读取数据块时,从java管理的线程异步调用complete方法.要重用CompletionHandler:
// More data to read
ch.read(buffer,this); //here you pass the same CompletionHandler you are using
java人员建议当你完成读操作(else块)时,你应该使用另一个线程上下文.
这是为了避免在CompletionHandler中阻塞和长期操作的文档,请参阅第33页http://openjdk.java.net/projects/nio/presentations/TS-4222.pdf