使用Netty服务文件-响应被截断一个字节

2019年7月20日 26点热度 0条评论

我已经通过Netty服务器提供了来自Android资产的文件(图片,html)。
诸如html之类的文本文件另存为.mp3以禁用压缩(我需要输入流!)

我的管道看起来像这样:

    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
}

使用该处理程序,我的休止符至少被截断了一个字节。如果我将
ChunkedStream更改为
ChunkedNioFile(因此使用
is.getChannel()而不是
is作为其构造函数)-一切都会正常进行。

请帮助我了解ChunkedStream出了什么问题。

解决方案如下:

您的代码对我而言似乎正确。返回的AssetFileDescriptor的FileInputStream是否包含“所有字节”?您可以通过单元测试进行检查。如果其中没有错误,则说明其净资产存在错误。我大量使用了ChunkInputStream,但从来没有遇到过这样的问题,但也许它确实取决于InputStream的性质。

如果您可以编写一个测试用例并在netty的github上打开一个问题,那就太好了。