Netty会自动刷新写入的数据吗?

时间:2019-08-17 06:47:08

标签: java netty

最近,我正在编写一个http服务器,并将一些netty组件移植到了我的项目中。当我阅读netty的ChannelHandlerContext的源代码时,我发现实际上它并没有刷新到套接字中。我知道必须调用flush()才能将内部缓冲区刷新到套接字中。

所以我想知道netty是否会自动刷新内部缓冲区,我已经阅读了一些源代码,但是我并不擅长。我用谷歌搜索,但没有一个回答,我唯一的答案是冲洗。

我从源代码中学到的是:将继续写入出站缓冲区,如果出站缓冲区达到高水位线,则会触发可写性更改事件,并且通道不可写。

3 个答案:

答案 0 :(得分:1)

如果要在一行中执行此操作,则可以调用writeAndFlush方法,但否则需要刷新,否则数据将无法通过。

答案 1 :(得分:0)

4.0引入了一个名为flush()的新操作,该操作显式刷新Channel的出站缓冲区,而write()操作不会自动刷新。您可以将其视为java.io.BufferedOutputStream,除了它可以在消息级别使用。

由于此更改,您必须非常小心,不要在写完东西后忘记调用ctx.flush()。另外,您可以使用快捷方式writeAndFlush()

我在https://netty.io/wiki/new-and-noteworthy-in-4.0.html#write-does-not-flush-automatically

找到了它

实际上,我在Why did not call ctx.flush() after ctx.write() is called at Netty user guide?处有类似的问题

如果找到答案,请与我联系。

答案 2 :(得分:0)

不,不会。

但是,它可以很容易地实现。

正如你所说:

<块引用>

我从源码中学到的是:写继续写成 出站缓冲区,如果出站缓冲区达到高水位线,它将 触发可写性更改事件且通道不可写。

没错。它实际上告诉了一种自动刷新的方法。只需覆盖 ChannelInboundHandler.channelWritabilityChanged 即可调用 flush()