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

前端之家收集整理的这篇文章主要介绍了如何使用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 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

猜你在找的Java相关文章