Netty写操作的ChannelFuture何时变为“完成”?

3
在Netty 4中,当一个写操作(比如向NioSocketChannel写入数据)的ChannelFuture何时确切地变为“完成”?Netty是否会等待一个ACK数据包?在ChannelPipeline中的输入和输出处理器之间是否存在标记写入futures已完成的相互依存关系?

2
Netty无法等待ACK数据包。Java或BSD套接字API中没有任何允许您这样做的内容。 - user207421
1个回答

4
Netty不等待ACK数据包。ACK数据包是TCP的实现细节,对于使用套接字的应用程序来说大部分(完全?在java中是的,但不确定C中的套接字API)是隐藏的。如果您需要知道何时传递消息,则应向应用程序层协议添加确认组件。
在Netty 3.x中,Netty会在给定消息写入套接字后调用success方法(并通知侦听器)。我对Netty 4的实现细节不太熟悉,但从我的源代码跟踪中,我相信这在Netty 4中也是正确的。

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

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


感谢您的详细回答!不幸的是,这不是我的协议(请参见 https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction.html),所以看起来我们可能需要处理一些不确定性。干杯! - Jon Chambers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接