【问题标题】:When does a Netty ChannelFuture for a write operation become "done?"写入操作的 Netty ChannelFuture 何时“完成”?
【发布时间】:2013-09-03 11:13:20
【问题描述】:

在 Netty 4 中,写操作的ChannelFuture(假设是NioSocketChannel)何时“完成”? Netty 是否等待ACK 数据包?在将写入期货标记为完成方面,ChannelPipeline 中的输入和输出处理程序之间是否存在任何相互依赖关系?

【问题讨论】:

  • Netty 不能等待一个 ACK​​ 包。 Java 或 BSD 套接字 API 中的任何内容都不允许您这样做。

标签: java netty


【解决方案1】:

Netty 不等待ACK 数据包。 ACK 数据包是 TCP 的一个实现细节,它大部分(完全?在 java 中是的,但不确定 C 中的套接字 api)使用套接字对应用程序隐藏。如果您需要知道消息何时传递,您应该在应用层协议中添加一个确认组件。

在 Netty 3.x 中,在将给定消息写入套接字后,Netty 将在 ChannelFuture 上调用成功方法(并通知侦听器)。我对 Netty 4 的实现细节不太熟悉,但从我的追踪来源来看,我相信这在 Netty 4 中也是如此。

ChannelOutboundBuffer.remove() @ ChannelOutboundBuffer.java:263 设置未来的成功,并在消息写入套接字后由NioSocketChannel.doWrite(ChannelOutboundBuffer) @ NioSocketChannel.java:264 调用。

请注意,写入套接字并不一定意味着消息已发送(部分或全部),仅表示已将消息写入 TCP 层中套接字的发送缓冲区。

【讨论】:

最近更新 更多