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

时间:2013-09-02 20:15:36

标签: java netty

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

1 个答案:

答案 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层中套接字的发送缓冲区。