最近我正在尝试使用netty。我遇到了以下问题:
ctx.channel().write(new TextWebSocketFrame("hello"))
在客户端没有返回 hello ,但是ctx.channel().writeAndFlush(new TextWebSocketFrame("hello"))
已经。{/ p>
两者有什么区别? ctx
是ChannelHandlerContext
。
答案 0 :(得分:3)
根据文件
http://netty.io/4.0/api/io/netty/channel/Channel.html
channel.writeAndFlush(msg);
是
的快捷方式 channel.write(msg);
channel.flush();
并且flush()
刷新(写下)所有待处理的缓冲区。
答案 1 :(得分:1)
我认为它的工作方式是如果你使用write并且你发送的数据超过缓冲区可以容纳的数据,它将在缓冲区已满时自动刷新,以便为更多数据缓冲腾出空间。最后,当没有其他数据通过缓冲区推送其他数据时,您必须调用flush()来刷新缓冲区中剩余的内容。在你的情况下,你发送的内容不超过缓冲区大小,因此它位于缓冲区中,没有任何东西推动它,这就是为什么你必须在写入后调用flush()来推送缓冲区中剩余的东西。 writeAndFlush方法为您自动执行此操作我认为当它到达结束时它会自动刷新缓冲区。
答案 2 :(得分:0)
嗯,显然在Netty write()
缓冲区和flush()
刷新。事实上,与BufferedOutputStream
完全相同。
所以出现了问题:什么时候到flush()
?答案是,在发送请求或响应结束时,除非您要关闭频道。例如,在客户端中,值得所有请求kart,flush,然后读取响应。在服务器中,发送所有响应部分,然后刷新。