我已经通过Netty服务器(images,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
}
有了这个处理程序,我的呼吸至少被截断了一个字节。如果我将ChunkedStream
更改为ChunkedNioFile
(因此使用is.getChannel()
而不是is
作为它的构造函数),那么一切都可以完美地工作。
请帮我了解ChunkedStream出了什么问题。
您的代码看起来很对。AssetFileDescriptor返回的FileInputStream是否包含"所有字节"?你可以通过单元测试来检查这一点。如果里面没有虫子,那就是netty里的虫子。我大量使用ChunkInputStream,从未遇到过这样的问题,但也许这真的取决于InputStream的性质。
如果你能写一个测试用例并在netty的github上打开一个问题,那就太好了。