Передача файлов Netty 4.0 SPDY не работает

#file #http #netty #spdy

#файл #http #netty #spdy

Вопрос:

В течение долгого времени я всегда сталкиваюсь с одной и той же проблемой, когда пытаюсь использовать SPDY с netty.

Я проверил различные источники SPDY, чтобы настроить свой SPDY-сервер. Пока это работает нормально, и я получил чистый HTML-вывод в моем браузере. Chrome также показывает сеанс spdy.

Проблема

Когда я добавляю HttpStaticFileServerHandler класс примера netty 4 в класс SPDYorHTTPHandler , я всегда сталкиваюсь с одной и той же проблемой.

Содержимое HTML отправляется, но содержимое файла — нет. Обработчик отправляет ответ, поэтому мой клиент извлекает, но затем файлы никогда не передаются.

Есть идеи по этому поводу?

ctx.write(response) записывает ответ клиенту (ответ представляет собой HttpResponse объект obj).

В следующей строке:( raf=RandomAccessFile )

 ChannelFuture sendFileFuture;
    if (useSendFile) {
        sendFileFuture = ctx.write(new DefaultFileRegion(raf.getChannel(), 0, fileLength), ctx.newProgressivePromise());
    } else {
        sendFileFuture = ctx.write(new ChunkedFile(raf, 0, fileLength, 8192), ctx.newProgressivePromise());
    }
  

Но он никогда не записывается. Код на 100% основан на HttpStaticFileServerHandler примере и примере SPDY netty 4.

Я только что изменил значение createHttpRequestHandlerForHttp output с SpdyServerHandler на HttpStaticFileServerHandler .

Это линия, которую я использую:

     ChannelPipeline pipeline = ctx.pipeline();
    pipeline.addLast("spdyFrameCodec", new SpdyFrameCodec(version));
    pipeline.addLast("spdySessionHandler", new SpdySessionHandler(version,true));
    pipeline.addLast("spdyHttpEncoder", new SpdyHttpEncoder(version));
    pipeline.addLast("spdyHttpDecoder", new SpdyHttpDecoder(version, MAX_CONTENT_LENGTH));
    pipeline.addLast("spdyStreamIdHandler", new SpdyHttpResponseStreamIdHandler());
    pipeline.addLast("chunkedWriter", new ChunkedWriteHandler());
    pipeline.addLast("httpRequestHandler",new HttpStaticFileServerHandler());
  

Если вам нужно больше кода для этого, просто напишите, я расширю пост.

У меня нет ошибок, предупреждений или чего-то еще.

A ChannelProgressiveFutureListener никогда не вызывал operationProgressed функцию.

Спасибо, додо.

Ответ №1:

Попробуйте использовать:

 sendFileFuture = ctx.write(new HttpChunkedInput(new ChunkedFile(raf, 0, fileLength, 8192)), ctx.newProgressivePromise());
  

Комментарии:

1. Большое спасибо, это работает. Но все же я не понимаю, почему это работает. Почему мне нужно добавить HttpChunkedInput?

2. Потому что в противном случае ChunkedWriteHandler будет выдавать ByteBuf, а не HttpContent . Обработчики Spdy ожидают HttpContent.