Java 在Netty中以编程方式刷新通道
我有一个Netty应用程序,它将HTTP连接和断断续续的数据流带回,同时保持连接打开,直到客户端关闭它。我可以让应用程序正常工作,但发送缓冲区没有足够频繁地推送到客户端(并且经常跨越合并的写入事件,导致另一端的数据接收不完整,直到推送到下一个缓冲区,这可能需要很长时间)。我想知道是否有一种方法可以让我写入发送缓冲区并强制刷新以将完整的数据块推送到客户端,而无需关闭套接字 我查看了引导属性Java 在Netty中以编程方式刷新通道,java,netty,Java,Netty,我有一个Netty应用程序,它将HTTP连接和断断续续的数据流带回,同时保持连接打开,直到客户端关闭它。我可以让应用程序正常工作,但发送缓冲区没有足够频繁地推送到客户端(并且经常跨越合并的写入事件,导致另一端的数据接收不完整,直到推送到下一个缓冲区,这可能需要很长时间)。我想知道是否有一种方法可以让我写入发送缓冲区并强制刷新以将完整的数据块推送到客户端,而无需关闭套接字 我查看了引导属性tcpNoDelay,writeBufferHighWaterMark,以及writeBufferLowWat
tcpNoDelay
,writeBufferHighWaterMark
,以及writeBufferLowWaterMark
(所有这些属性都带有或不带“child.”,但没有任何效果
有什么建议吗?谢谢 我想我回答了我自己的问题,这不是因为套接字缓冲区没有发送数据。我使用“curl”测试响应,curl有一个内部缓冲区,防止数据打印到屏幕上。这可以用“-N”禁用。这完全是我自己的错,但仍然需要一段时间来挖掘代码并将其追溯到我的客户端。我想我回答了我自己的问题,这不是因为套接字缓冲区没有发送数据。我使用“curl”测试响应,curl有一个内部缓冲区,防止数据打印到屏幕上。这可以用“-N”禁用。这完全是我自己的错,但仍然需要一段时间来挖掘代码并将其追溯到我的客户端。以防万一,Netty没有
flush()
操作。它只是尽快写入。为了防止不清楚,Netty没有flush()
操作。它只是尽快写入。我认为您可以向ChannelPipeline添加一个BufferedWriteHandler,以模拟缓冲写入操作
只要您可以维护或获取对BufferedWriteHandler的流水线实例的引用
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
BufferedWriteHandler bufferedWriter
= e.getChannel().getPipeline().get("buffer");
然后,您可以按自己的喜好以编程方式刷新:
bufferedWriter.flush();
我认为您可以向ChannelPipeline添加一个BufferedWriteHandler,以模拟缓冲写操作 只要您可以维护或获取对BufferedWriteHandler的流水线实例的引用
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
BufferedWriteHandler bufferedWriter
= e.getChannel().getPipeline().get("buffer");
然后,您可以按自己的喜好以编程方式刷新:
bufferedWriter.flush();
我也尝试过将“sendBufferSize”选项设置为0,没有任何更改。通过服务器套接字的绑定进行跟踪,我发现bufferFactory、receiveBufferSize、reuseAddress和backlog是唯一可以在服务器套接字端设置的属性。我想接下来我必须看看bufferFactory。我还尝试了将“sendBufferSize”选项设置为0,没有任何更改。通过服务器套接字的绑定进行跟踪,我发现bufferFactory、receiveBufferSize、reuseAddress和backlog是唯一可以在服务器套接字端设置的属性。我想我下一步得去看看工厂。