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

问题描述

completed当读取数据块时,从java管理的线程异步调用方法。要重用CompletionHandler:

// More data to read
ch.read(buffer, null, this); //here you pass the same CompletionHandler you are using

Java专家建议,当您完成读取操作(该else块)时,应使用另一个线程上下文。

这是为了避免在a内部阻塞和长期运行的文档CompletionHandler,请参见第33页http://openjdk.java.net/projects/nio/presentations/TS-4222.pdf

解决方法

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

我想以一种非阻塞和异步的方式解决这个问题。

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”