如何使用CompletionHandlers和小于请求的ByteBuffer读取请求?

我正在使用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

我写的地方:

// 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

相关文章

Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+Sh...
运行程序出现下面错误:HTTP Status 500 ------------------...
1、建立DM的profile,使用的模版在install_root/profileTempl...
使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是...
英文操作系统导致 Debug 下的变量查看时显示乱码,可通过改变...
eclipse中javascript报错问题处理:三个地方:<1&...