我正在使用 Netty 3.6.6,我想向调用者发送一个大的响应。我无法将响应正文复制到 ChannelBuffer 中,因为在某些情况下它会非常大。
我正在将服务器从CXF迁移到Netty,以前,我只能使用CXF提供的OutputStream来写入数据。
我最初尝试只发送不带内容的响应,然后继续将数据写入一系列 8k 缓冲区中的 Channel。这失败了,因为客户似乎得到了原始响应,但看不到数据并抱怨。我尝试将响应设置为分块,但这似乎没有什么区别,设置分块标头也没有什么区别,客户端总是看到一个空流。
我看到了 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));
产生不良行为,客户端收到几百个字节,然后停止接收,基本上就是我在应用程序中看到的情况。正确的事情似乎只发生在内容长度上,这在我的用例中是不可行的。