最近,我正在编写一个http服务器,并将一些netty组件移植到了我的项目中。当我阅读netty的ChannelHandlerContext
的源代码时,我发现实际上它并没有刷新到套接字中。我知道必须调用flush()
才能将内部缓冲区刷新到套接字中。
所以我想知道netty是否会自动刷新内部缓冲区,我已经阅读了一些源代码,但是我并不擅长。我用谷歌搜索,但没有一个回答,我唯一的答案是冲洗。
我从源代码中学到的是:将继续写入出站缓冲区,如果出站缓冲区达到高水位线,则会触发可写性更改事件,并且通道不可写。
答案 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()
。