Frage

Ich habe ein Dateien von Android Assets über Netty Server dient (Bilder, HTML). Text-Dateien so ein html als .mp3 zu deaktivieren Kompression gespeichert wird (Ich brauche einen Inputstream!)

Meine Pipeline wird wie folgt aussehen:

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

Mein Handler ist:

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
}

Mit diesem Handler ich habe meine resposes abgeschnitten bekam von mindestens einem Byte. Wenn ich ChunkedStream zu ChunkedNioFile ändern (und verwenden Sie so eine is.getChannel() statt is als Konstrukteur, um es) - alles perfekt funktioniert.

Bitte, mir helfen verstehen, was mit ChunkedStream falsch ist.

War es hilfreich?

Lösung

Ihr Code sieht mir recht. Ist der zurückgegebene Fileinputstream von AssetFileDescriptor enthalten „alle die Bytes“? Sie können dies überprüfen, mit einem Gerät zu testen. Wenn es in ihm keinen Fehler dann in netty seinem Bug. Ich mache die starke Nutzung von ChunkInputStream und hatte nie ein solches Problem noch nicht, aber vielleicht ist es hängt wirklich von der Art des Input.

Wäre schön, wenn Sie einen Testfall schreiben könnte und öffnen Sie ein Problem bei netty der Github.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top