最近我在试验网络技术。我遇到了以下问题:
ctx.channel().write(new TextWebSocketFrame("hello"))没有在客户端返回hello,但ctx.channel().writeAndFlush(new TextWebSocketFrame("hello"))返回了。
两者有什么区别?ctx是ChannelHandlerContext。
发布于 2014-10-17 13:02:14
根据医生
http://netty.io/4.0/api/io/netty/channel/Channel.html
channel.writeAndFlush(msg); 的快捷方式。
channel.write(msg);
channel.flush();flush()会刷新(写入)所有挂起的缓冲区。
发布于 2014-10-17 13:05:22
我认为它的工作方式是,如果您使用write,并且您发送的数据比缓冲区所能容纳的数据还多,那么当缓冲区已满时,它将自动刷新,以便为更多的数据提供缓冲空间。最后,当没有更多的数据将其他数据推送到缓冲区中时,您必须调用flush()来刷新缓冲区中剩余的内容。在您的示例中,您要发送的内容并不会释放缓冲区大小,因此它位于缓冲区中,没有任何东西推动缓冲区通过,这就是为什么您必须在写完之后调用刷新()来推送缓冲区中剩余的内容。writeAndFlush方法为您自动完成此操作,我认为,当它到达末尾时,它会自动刷新缓冲区。
发布于 2014-10-17 22:30:19
显然是在Netty write()缓冲器和flush()刷新中。事实上,与BufferedOutputStream完全一样。
因此,问题就出现了:什么时候去flush()?答案是,在发送请求或响应结束时,除非您即将关闭通道。例如,在客户端中,需要调用所有的请求卡,然后刷新,然后读取响应。在服务器中,发送所有响应部分,然后刷新。
https://stackoverflow.com/questions/26425486
复制相似问题