java - 使用 Netty 提供文件 - 响应被截断一个字节

标签 java android nio netty android-assets

我通过 Netty 服务器从 Android Assets 提供文件(图像、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 是否包含“所有字节”?您可以通过单元测试来检查这一点。如果其中没有错误,那么它是netty中的错误。我大量使用 ChunkInputStream,但从未遇到过这样的问题,但也许这实际上取决于 InputStream 的性质。

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

关于java - 使用 Netty 提供文件 - 响应被截断一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826529/

相关文章:

java - 我必须返回什么?方法插入

java - 如何捕获 Java 中的堆栈溢出并从中恢复?

android - Activity 开始时,CardView 没有显示在 recyclerview 中?

android - 对两个相关字符串数组进行排序

java - 在 Java 中锁定文件 channel 时出现 OverlappingFileLockException

java - 无法通过管理控制台保存 Weblogic JTA 设置

android - 计算android中两个经纬度点之间的距离

java - NIO channel 上的写入和发送有什么区别?

java - 是否可以检测内核生成 epoll 的时刻与 Sun JVM 读取它的时刻之间的时间差?

java - 调用者阻塞直到 getFoo() 准备好一个值?