Netty 4.0 SPDY 文件传输不工作

Posted

技术标签:

【中文标题】Netty 4.0 SPDY 文件传输不工作【英文标题】:Netty 4.0 SPDY file transfer not working 【发布时间】:2014-08-12 03:07:21 【问题描述】:

很长一段时间以来,当我尝试将 SPDY 与 netty 一起使用时,我总是遇到同样的问题。

我检查了不同的 SPDY 源来设置我的 SPDY 服务器。到目前为止,它工作正常,我的浏览器中有一个纯 html 输出。 Chrome 还会显示一个 spdy 会话。

问题

当我将 netty 4 HttpStaticFileServerHandler 示例类放到 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 示例和 netty 4 的 SPDY 示例。

我刚刚将 createHttpRequestHandlerForHttp outputSpdyServerHandler 更改为 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());

如果您需要更多代码,请写,我会扩展帖子。

我没有收到任何错误、警告或其他信息。

ChannelProgressiveFutureListener 从未调用过 operationProgressed 函数。

谢谢渡渡鸟。

【问题讨论】:

【参考方案1】:

尝试使用:

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

【讨论】:

非常感谢,这是有效的。但我不明白为什么它会起作用。为什么我需要添加一个 HttpChunkedInput? 因为否则 ChunkedWriteHandler 将产生 ByteBuf 而不是 HttpContent。 Spdy 处理程序需要 HttpContent。

以上是关于Netty 4.0 SPDY 文件传输不工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 netty 客户端与 spdy 服务器对话

java中使用netty的SPDY客户端和服务器

Netty 之 FileRegion 文件传输

在 Android 上添加 spdy 编解码器后使用 netty 连接失败

netty系列之:让TLS支持http2

Netty实现类似Http File Server文件传输功能