如何确认Netty已尝试读取套接字

4

我希望在关闭连接之前从netty确认已发生读取事件。无论是实际读取的字节数,还是发生了错误,都没有关系。

从搜索netty代码中,我不认为以下操作顺序有保障:

channel.read();
channel.close();

由于Netty的事件循环中,读取事件不是一个“任务”,因此关闭任务可能会在读取事件之前执行。

没有可以使用的“读取Future”。那么我的问题是:如何最好地确保在关闭通道之前发生读取事件?

如果使用自动读取:如果Netty当前正在其任务循环中通过电线写入数据,并且我们调用channel.close(),那么读取操作会发生还是关闭会先发生?


请问您能否分享一下目前的代码? - Don Cruickshank
这个解释对我来说很有道理;这更多是关于Netty的设计问题,而不是关于使用Netty的特定代码位。@DonCruickshank,你认为缺少什么信息? - Jon Chambers
1个回答

2
在Netty中,read()flush()是特殊的操作,不会返回ChannelFuture。这是因为read()操作的结果是channelRead()channelReadComplete()或者exceptionCaught()flush()操作没有ChannelFuture,因为它总是与write()一起出现,而你可以在那里得到future。
因此,要查看数据是否实际从套接字读取,可以查看处理程序的channelRead()是否被调用。
另一方面,默认情况下,Netty已经打开了ChannelOption.AUTO_READ,所以根本不需要调用read()。它只需要在连接变为活动状态时就开始读取。

1
明白了,但这只会发生在数据实际被读取的情况下。有没有办法知道我们“尝试”读取但没有可用数据?或者,除了尝试读取它之外,是否还有其他方法可以确定数据可能可用?直接问题是APNs客户端的拉取请求,根据Netty中的自动关闭更改。 - Jon Chambers
channelReadComplete 看起来很有趣,从代码的查看中可以发现它总是会被触发,无论读取的字节数量(或异常抛出)如何。@trustin 您能确认这是否正确吗? - AndrewSchmidt
关于自动读取(autoread):如果Netty当前正在任务循环中通过网络写入数据,并且我们调用channel.close(),那么会发生读操作还是先关闭? - AndrewSchmidt
@trustin @AndrewSchmidt 我创建了一个简单的测试应用程序来尝试这个功能,但似乎没有起作用。请求读取并没有触发channelReadCompleteexceptionCaught方法的调用。虽然我可能弄错了什么;示例应用程序位于https://gist.github.com/jchambers/7487099。 - Jon Chambers

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