在Netty 4中,确切地说,ChannelFuture
用于写入操作(让我们说NioSocketChannel
)变为“完成了吗?” Netty会等待ACK
数据包吗?在将写入期货标记为已完成时,ChannelPipeline
中的输入和输出处理程序之间是否存在任何相互依赖关系?
答案 0 :(得分:2)
Netty不会等待ACK
个数据包。 ACK
数据包是TCP的一个实现细节,主要是(完全是在Java中是的,但不确定C中的socket api)使用套接字隐藏到应用程序。如果您需要知道何时传递消息,则应将确认组件添加到应用程序层协议中。
在Netty 3.x中,在给定的消息写入套接字后,Netty会在ChannelFuture
上调用success方法(并通知侦听器)。我对Netty 4的实现细节并不熟悉,但是通过我的追踪,我相信在Netty 4中也是如此。
ChannelOutboundBuffer.remove() @ ChannelOutboundBuffer.java:263
设置未来的成功,并在完成写入套接字的消息后由NioSocketChannel.doWrite(ChannelOutboundBuffer) @ NioSocketChannel.java:264
调用。
请注意,写入套接字并不一定意味着已经(部分或全部)发送了消息,只是它已经被写入TCP层中套接字的发送缓冲区。