Question

J'ai un service de fichiers actifs Android via le serveur Netty (images, html). fichiers texte un tel html est enregistré en tant que .mp3 pour désactiver la compression (je besoin d'un InputStream!)

Mon pipeline est à la recherche comme ceci:

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

Mon gestionnaire est:

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
}

Avec ce gestionnaire j'ai mes resposes tronquées par au moins un octet. Si je change ChunkedStream à ChunkedNioFile (et donc utiliser un is.getChannel() au lieu de is en tant que constructeur à lui) - tout fonctionne parfaitement.

S'il vous plaît, aidez-moi à comprendre ce qui ne va pas avec ChunkedStream.

Était-ce utile?

La solution

Votre code semble bon pour moi. Le retour de FileInputStream AssetFileDescriptor contient « tous les octets »? Vous pouvez vérifier cela avec un test unitaire. S'il n'y a pas de bug dans ce alors un bogue dans son Netty. Je faire un usage intensif de ChunkInputStream et n'a jamais encore eu un tel problème, mais peut-être cela dépend vraiment de la nature du InputStream.

Ce serait bien si vous pouviez écrire un test et ouvrez une question au github Netty.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top