如何使用netty通过HTTP传输响应

如何使用netty通过HTTP传输响应,netty,Netty,我使用的是Netty 3.6.6,我想向来电者发送一个大的回复。我无法将响应主体复制到ChannelBuffer中,因为在某些情况下它会非常大 我正在将服务器从CXF迁移到Netty,以前,我可以使用CXF提供的OutputStream来写入数据 我最初尝试只发送没有内容的响应,然后继续在一系列8k缓冲区中向通道写入数据。这失败了,因为客户端似乎得到了原始响应,没有看到任何数据和投诉。我尝试将响应设置为chunked,但这似乎没有什么区别,设置chunked头也没有什么区别,客户端总是看到一个空

我使用的是Netty 3.6.6,我想向来电者发送一个大的回复。我无法将响应主体复制到ChannelBuffer中,因为在某些情况下它会非常大

我正在将服务器从CXF迁移到Netty,以前,我可以使用CXF提供的OutputStream来写入数据

我最初尝试只发送没有内容的响应,然后继续在一系列8k缓冲区中向通道写入数据。这失败了,因为客户端似乎得到了原始响应,没有看到任何数据和投诉。我尝试将响应设置为chunked,但这似乎没有什么区别,设置chunked头也没有什么区别,客户端总是看到一个空流

我看到了3.6.6的文件服务器示例,这与我想要做的类似,只是数据不是文件。我看到了ChunkedStream和NioStream,这似乎接近我所需要的,只是它们采用了InputStream/ReadableByteChannel,而我有一个OutputStream;我可以尝试使用PipedInput&OutputStreams,但这似乎会引入一个不幸的瓶颈

我确信有一种方法可以将大量数据流式传输回客户端以响应请求,但我只是不知道如何做,除非我有一个文件

我还很好奇,如果连接保持活动状态,并且您正在流式传输内容,但不知道内容长度,您如何让客户端知道响应已完成。在这种情况下,客户端似乎会永远等待连接关闭

修改3.6.6中的静态文件服务器示例以删除内容长度头(只需注释掉),指定其为分块响应

   response.setChunked(true);
   response.setHeader(Names.TRANSFER_ENCODING, Values.CHUNKED);
然后在写入响应后使用
ChunkedNioStream
发送文件:

    // Write the initial line and the header.
    ch.write(response);

    final ReadableByteChannel aIn = java.nio.channels.Channels.newChannel(new FileInputStream(file));
    ChannelFuture writeFuture = ch.write(new ChunkedNioStream(aIn));

产生不希望出现的行为,客户端得到几百个字节,然后停止接收,基本上就是我在应用程序中看到的。正确的事情似乎只发生在内容长度上,这在我的用例中是不可行的。

当您尝试将
ChunkedNioStream
写入
ChunkedWriteHandler
时,它只会生成一个只包含
ChunkedNioStream
内容的流。也就是说,它产生
ChannelBuffer
s,而不是
HttpChunk
s

由于
httpmessageincoder
仅处理
HttpMessage
HttpChunk
,因此
ChunkedNioStream
生成的
ChannelBuffer
被绕过到连线,没有预先设置HTTP区块头,导致浏览器混乱


要解决此问题,您必须实现自己的
ChunkedInput
,它生成
HttpChunk
s,而不是
ChannelBuffer
s。但是,我必须同意,这可能是一项具有挑战性的任务,因此您可能只需要fork
httpmessageincoder
,以便它也能理解
ChannelBuffer
,并像对待
HttpChunk
一样对待它。有关更多信息,请查看
httpmessageincoder

这似乎在Netty 4.x中用
ChunkedInput
修复了,对吗?