【问题标题】:how to confirm that netty has tried to read the socket如何确认netty已尝试读取套接字
【发布时间】:2013-11-14 15:43:04
【问题描述】:

我想从 netty 确认在我关闭连接之前发生了读取事件。它是否实际以字节为单位读取或发生错误都没有关系。

通过挖掘 netty 代码,我不相信以下保证操作顺序:

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

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

没有可以使用的“阅读未来”。所以我的问题是:保证在关闭通道之前发生读取事件的最佳方法是什么?”

如果使用自动读取:如果 netty 当前在它的任务循环中通过网络写入数据,并且我们调用 channel.close() 会发生读取操作还是会先发生关闭?

【问题讨论】:

  • 你能分享一下目前的代码吗?
  • 这个解释对我来说很有意义;这更多是关于 Netty 设计的问题,而不是关于使用 Netty 的特定代码的问题。 @DonCruickshank 您认为缺少哪些信息?

标签: netty


【解决方案1】:

在 Netty 中,read()flush() 是不返回 ChannelFuture 的特殊操作。这是因为read() 操作的结果是channelRead()channelReadComplete()exceptionCaught()flush() 操作没有ChannelFuture,因为它总是伴随着write(),你在那里得到了未来。

因此,要查看数据是否实际从套接字读取,您可以查看处理程序的 channelRead() 是否被调用。

另一方面,默认情况下,Netty 开启了ChannelOption.AUTO_READ,所以你根本不需要调用read()。只要连接激活,它就会立即读取。

【讨论】:

  • 了解,但只有在实际读取数据时才会发生这些情况。有什么方法可以知道我们尝试过阅读,但没有可用的数据?或者,除了尝试读取数据之外,还有其他方法可以查看数据是否可用?最接近的问题是a pull request for an APNs client 跟在auto-close changes in Netty 之后。
  • channelReadComplete 看起来很有趣,并且通过查看代码,无论读取的字节数(或抛出的异常)如何,它总是会被触发。 @trustin 你能确认一下吗?
  • 关于自动读取:如果netty当前在它的任务循环中通过网络写入数据,我们调用channel.close()会发生读取操作还是会先发生关闭?
  • @trustin @AndrewSchmidt 我创建了一个简单的测试应用程序来尝试这个,但它似乎没有用。请求读取不会触发对channelReadCompleteexceptionCaught 方法的调用。不过,我有可能搞砸了。示例应用位于gist.github.com/jchambers/7487099
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
相关资源
最近更新 更多