如何读取使用CompletionHandlers比要求更小的字节缓冲区的请求?(How to rea

2019-06-24 16:32发布

我使用的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

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

Answer 1:

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

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

java的人建议,当你完成读操作时( else块),你应该使用其他线程上下文。

这是说,为了避免内部阻塞和长寿命操作文档CompletionHandler ,看在33页http://openjdk.java.net/projects/nio/presentations/TS-4222.pdf



文章来源: How to read a request using CompletionHandlers and a ByteBuffer smaller than the request?