什么时候写入操作的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层中套接字的发送缓冲区。