0

Netty サーバー (画像、html) を介して Android アセットからファイルを提供しています。HTML などのテキスト ファイルは、圧縮を無効にするために .mp3 として保存されます (InputStream が必要です!)

私のパイプラインは次のようになっています。

    pipeline.addLast("decoder", new HttpRequestDecoder());
    pipeline.addLast("aggregator", new HttpChunkAggregator(65536));
    pipeline.addLast("encoder", new HttpResponseEncoder());
    pipeline.addLast("chunkedWriter", new ChunkedWriteHandler());

    pipeline.addLast("handler", new AssetsServerHandler(context));

私のハンドラーは次のとおりです。

public class AssetsServerHandler extends SimpleChannelUpstreamHandler {

    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {

        // some checks

        final FileInputStream is;
        final AssetFileDescriptor afd;
        try {
            afd = assetManager.openFd(path);
            is = afd.createInputStream();   
        } catch(IOException exc) {
            sendError(ctx, NOT_FOUND);
            return;
        }

        final long fileLength = afd.getLength();

        HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
        setContentLength(response, fileLength);

        final Channel ch = e.getChannel();
        final ChannelFuture future;
        ch.write(response);
        future = ch.write(new ChunkedStream(is));
        future.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                future.getChannel().close();
            }
        });
        if (!isKeepAlive(request)) {
            future.addListener(ChannelFutureListener.CLOSE);
        }
    }
    // other stuff
}

そのハンドラーを使用すると、レスポーズが少なくとも 1 バイト切り捨てられます。に変更ChunkedStreamするとChunkedNioFile(コンストラクターのis.getChannel()代わりにa を使用するisと)、すべてが完全に機能します。

ChunkedStream の何が問題なのかを理解してください。

4

1 に答える 1

1

あなたのコードは私には正しく見えます。返された AssetFileDescriptor の FileInputStream には「すべてのバイト」が含まれていますか? これは単体テストで確認できます。バグがない場合は、netty のバグです。私は ChunkInputStream を多用しており、まだそのような問題が発生したことはありませんが、実際には InputStream の性質に依存している可能性があります。

テスト ケースを作成し、netty の github でイシューを開いていただければ幸いです。

于 2012-01-12T08:27:28.373 に答える