سؤال

ولقد يقضي الملفات من الأصول الروبوت عن طريق الخادم Netty (صور، أتش تي أم أل). ملفات نصية يتم حفظ مثل هذا أتش تي أم أل كما .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
}

مع أن معالج لقد حصلت resposes بلدي اقتطاعها من بايت واحد على الأقل. إذا قمت بتغيير ChunkedStream إلى ChunkedNioFile (وذلك باستخدام is.getChannel() بدلا من is باعتباره المنشئ لها) - كل شيء يعمل بشكل جيد.

يرجى، مساعدتي على فهم ما هو الخطأ في ChunkedStream.

هل كانت مفيدة؟

المحلول

والتعليمات البرمجية الخاصة بك تبدو الحق بالنسبة لي. هل فيلينبوتستريام عاد من AssetFileDescriptor تحتوي على "كافة وحدات البايت"؟ هل يمكن أن تحقق هذا مع اختبار وحدة. إذا لم يكن هناك خطأ في ذلك، ثم خلل في netty. I جعل الاستخدام المكثف للChunkInputStream وليس لديهم مثل هذه المشكلة بعد، ولكن ربما انها حقا يتوقف على طبيعة InputStream.

وسيكون من الرائع إذا كنت يمكن أن يكتب حالة اختبار وفتح القضية في جيثب netty ل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top