5

私はJava7とを使用していますAsynchronousSocketChannel。リクエスト(例HTTP POST)を読みたいのですが、使用しているサイズよりも大きい場合は、リクエスト全体を読むための優れた解決策を見つけるのに苦労していByteBufferます。たとえば、ByteBufferが4048バイトで、HTTPPOSTに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ブロック)を終了するときに、別のスレッドコンテキストを使用することをお勧めします。

これは、内部でのブロックや長期にわたる操作を回避するためのドキュメントです。33CompletionHandlerページを参照してください。http://openjdk.java.net/projects/nio/presentations/TS-4222.pdf

于 2012-05-22T10:43:32.997 に答える