5

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

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

4

1 回答 1

4

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

于 2012-05-22T10:43:32.997 回答