在Netty中以编程方式刷新通道

时间:2011-12-06 19:55:01

标签: java netty

我有一个Netty应用程序,它接受HTTP连接并将间歇性数据流回,同时保持连接打开,直到客户端关闭它。我可以让应用程序工作,除了发送缓冲区没有足够频繁地推送到客户端(并且经常在合并的写入事件中导致另一端的数据接收不完整,直到推送下一个缓冲区,这可能是好久不见了)。我想知道是否有办法让我写入发送缓冲区并强制刷新将一大块数据推送到客户端,而不必关闭套接字。

我查看了引导属性tcpNoDelaywriteBufferHighWaterMarkwriteBufferLowWaterMark(所有有和没有#34;孩子。")无效。

有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分:2)

如果不清楚,Netty没有flush()操作。它只是尽快写出来。

答案 1 :(得分:1)

我认为您可以向ChannelPipeline添加BufferedWriteHandler,以模拟缓冲写操作。

BufferedWriteHandler web doc

只要您可以维护或获取对BufferedWriteHandler的流水线实例的引用,

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
        BufferedWriteHandler bufferedWriter 
                = e.getChannel().getPipeline().get("buffer");

然后您可以按编程方式刷新:

bufferedWriter.flush();

答案 2 :(得分:0)

我想我回答了自己的问题,这不是因为套接字缓冲区没有发送数据。我正在使用“curl”测试响应,curl有一个内部缓冲区阻止数据打印到屏幕上。可以使用“-N”禁用此功能。完全是我自己的错,但仍然花了一些时间来挖掘代码并将其追溯到我的客户端。