【问题标题】:What is the difference between writing and writing with flush?写和用flush写有什么区别?
【发布时间】:2014-10-17 12:53:52
【问题描述】:

最近我正在尝试使用netty。我遇到了以下问题:

ctx.channel().write(new TextWebSocketFrame("hello")) 没有在客户端返回 hello,但 ctx.channel().writeAndFlush(new TextWebSocketFrame("hello")) 有。

两者有什么区别? ctxChannelHandlerContext

【问题讨论】:

  • 一般来说,写入可能会在刷新之前缓冲一些数据。写入和刷新意味着将数据放入流而不缓冲它。当发送大量数据时,缓冲通常更快。
  • 好吧,在我的情况下,只有“写”对发送数据没有帮助。
  • 即使您使用 write(),您也需要始终刷新数据,然后在写入后您应该执行 ctx.channel().flush()。缓冲区中剩余的任何内容都将被刷新(发送)。
  • @Md.ArafatAlMahmud 数据通常会在以下情况下被刷新:1.您手动请求它(使用刷新方法),2.缓冲区达到其限制,因此要获取更多数据,需要先将其推出。当然这是基本的,一些复杂的实现可能会检查计算机是否处于空闲状态,因为它什么都不做,所以是刷新缓冲区的好时机。可能还有其他情况。

标签: java netty nio


【解决方案1】:

根据文档

http://netty.io/4.0/api/io/netty/channel/Channel.html

  channel.writeAndFlush(msg); 

的快捷方式
  channel.write(msg);
  channel.flush();

flush() 刷新写下)所有待处理的缓冲区。

【讨论】:

  • 所以如果我不刷新,挂起的缓冲区总是保持挂起?
  • @Md.阿拉法特·马哈茂德:不,不要;但由 系统 决定何时实际写入缓冲区。
  • 我明白了。但我不确定 netty 本身是否会覆盖一般的缓冲机制。
  • @Md. Arafat Al Mahmud:有时我们必须坚持——“尽早将数据写入文件、频道等,其他软件正在等待”或“我们正处于致命的崩溃中,至少尽量写下我们要检查的缓冲区"
【解决方案2】:

我认为它的工作方式是,如果您使用 write 并且发送的数据多于缓冲区可以容纳的数据,它将在缓冲区已满时自动刷新,以便为缓冲更多数据腾出空间。最后,当没有更多数据通过缓冲区推送其他数据时,您必须调用 flush() 以刷新缓冲区中剩余的任何内容。在您的情况下,您发送的内容不会超过缓冲区大小,因此它位于缓冲区中并且没有任何东西可以推动它,这就是为什么您必须在写入后调用 flush() 以推动缓冲区中剩余的任何内容。 writeAndFlush 方法会自动为您执行此操作,我认为当它到达末尾时它会自动刷新缓冲区。

【讨论】:

  • 这是有道理的。
【解决方案3】:

嗯,显然在 Netty 中 write() 缓冲区和 flush() 刷新。事实上,就像在 BufferedOutputStream 中一样。

那么问题来了:什么时候去flush()?答案是,在发送请求或响应结束时,除非您即将关闭通道。例如,在客户端中,对所有请求卡丁车进行评估,刷新,然后读取响应。在服务器中,发送所有响应部分,然后刷新。

【讨论】:

  • 这有点不正确。如何处理这取决于您的OutputHandler 的实施。处理程序中的大多数write() 操作是立即的,但有些,例如the one for chunked http 只是将写入添加到队列中。只有刷新才会真正刷新队列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多