Pregunta

He sirven a los archivos de activos Android a través del servidor de Netty (imágenes, html). archivos de texto, un HTML se guarda como .mp3 para desactivar la compresión (Necesito un InputStream!)

Mi gasoducto está buscando de esta manera:

    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));

Mi manejador es:

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
}

Con ese manejador Tengo mi resposes truncados por al menos un byte. Si cambio ChunkedStream a ChunkedNioFile (y de usar una is.getChannel() en lugar de is como constructor a ella) - todo funciona perfectamente.

Por favor, me ayudan a entender lo que está mal con ChunkedStream.

¿Fue útil?

Solución

Su código es correcto para mí. ¿El FileInputStream regresado de AssetFileDescriptor contiene "todos los bytes"? Usted puede comprobar esto con una prueba de unidad. Si no hay ningún error en él, entonces es un error en Netty. Puedo hacer un uso intensivo de ChunkInputStream y nunca tuvo un problema todavía, pero tal vez lo que realmente depende de la naturaleza de la InputStream.

Sería bueno si usted podría escribir un caso de prueba y abrir un tema en github de Netty.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top