写入操作的 Netty ChannelFuture 何时变得"done?"



在Netty 4中,写入操作的ChannelFuture(比方说NioSocketChannel)究竟何时变为"完成"?Netty是否等待ACK数据包?ChannelPipeline中的输入和输出处理程序之间是否存在将写入期货标记为已完成的相互依赖关系?

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

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

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

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

最新更新