14

私が今使っているコード:

    Pooled<ByteBuffer> pooledByteBuffer = exchange.getConnection().getBufferPool().allocate();
    ByteBuffer byteBuffer = pooledByteBuffer.getResource();

    int limit = byteBuffer.limit();

    byteBuffer.clear();

    exchange.getRequestChannel().read(byteBuffer);
    int pos = byteBuffer.position();
    byteBuffer.rewind();
    byte[] bytes = new byte[pos];
    byteBuffer.get(bytes);

    String requestBody = new String(bytes, Charset.forName("UTF-8") );

    byteBuffer.clear();
    pooledByteBuffer.free();

clear()問題ないようですが、プールに戻す前に ByteBuffer が必要かどうかはわかりません。の使用についてもわかりませんexchange.getConnection().getBufferPool().allocate();。これについては、ドキュメントにはあまり記載されていません。

4

4 に答える 4

7

リクエストの本文を読み取る簡単な方法は、使用可能にするワーカー スレッドにディスパッチすることHttpExchange#getInputStream()です。

これを行うには 2 つの方法があります。またはドキュメントBlockingHandlerに示されているディスパッチ パターンを使用します。の使用例を次に示します。BlockingHandler

new BlockingHandler(myHandler)

発送はBlockingHandler基本的に当方が行います。

于 2015-01-10T14:40:15.180 に答える
2

@atok、私はあなたのメソッドをしばらく使用しますが、読み取り呼び出しの前にストリームが閉じられると、空のボディが得られることがあります。これは魅力のように機能します:

BufferedReader reader = null;
StringBuilder builder = new StringBuilder( );

try {
    exchange.startBlocking( );
    reader = new BufferedReader( new InputStreamReader( exchange.getInputStream( ) ) );

    String line;
    while( ( line = reader.readLine( ) ) != null ) {
        builder.append( line );
    }
} catch( IOException e ) {
    e.printStackTrace( );
} finally {
    if( reader != null ) {
        try {
            reader.close( );
        } catch( IOException e ) {
            e.printStackTrace( );
        }
    }
}

String body = builder.toString( );
于 2015-02-04T16:16:45.290 に答える