什么时候写入操作的Netty ChannelFuture“完成?”

在Netty 4中,确切地说,用于写入操作的ChannelFuture (比如NioSocketChannel )是否已“完成”? Netty会等待ACK数据包吗? 在将写入期货标记为已完成时, ChannelPipeline中的输入和输出处理程序之间是否存在任何相互依赖关系?

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

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

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

请注意,写入套接字并不一定意味着已经(部分或全部)发送了消息,只是它已经被写入TCP层中套接字的发送缓冲区。