#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.