java - Netty - connectTimeoutMillis 与 ReadTimeoutHandler

标签 java netty connection-timeout

来自 Netty API 文档

connectTimeoutMillis = "the connect timeout in milliseconds. 0 if disabled."

ReadTimeoutHandler = Raises a ReadTimeoutException when no data was read within a certain period of time.

从客户的角度来看,我对上述内容的解释是否正确?

The client will attempt to connect to the host for up to "connectTimeoutMillis". If a connection is established, and a ReadTimeoutHandler is NOT added to the Pipeline, a Channel can wait on a response indefinitely. If a ReadTimeoutHandler was added to the Pipeline, a ReadTimeoutException will be raised once timeoutSeconds has elapsed.

一般来说,我只想尝试连接到主机最多 'x' 秒,但如果通过网络发送请求,我想最多等待 'y' 秒回复。如果它塑造/影响答案,则客户端是 Netty,但服务器不是。

跟进:ReadTimeoutHandler 上的 timeoutSeconds 是连续字节读取之间的超时,还是整个请求/响应的超时?示例:如果 timeoutSeconds 为 60,并且每 59 秒读取一个字节(总共 1024 个字节),那么整个响应会在 60416 秒内成功读取,还是会因为总耗用时间超过 60 秒而失败?

最佳答案

ReadTimeoutHandler 不理解响应的概念。它只能理解 Netty 3 中的 messageReceived 事件或 Netty 4 中的 inboundBufferUpdated 事件。从 NIO 的角度来看,此行为的确切影响取决于 ReadTimeoutHandler 在管道中的位置。 (我从未使用过 OIO,所以不能说行为是否完全相同)。

如果 ReadTimeoutHandler 在管道中的任何帧解码器下方(即更靠近网络),那么您描述的行为是正确的 - 单个字节读取将重置计时器,并且正如您所确定的那样,可能会导致响应很长一段时间才能阅读。如果您正在编写服务器,这可能会被利用来形成拒绝服务攻击,而攻击者只需付出很少的努力。

如果 ReadTimeoutHandler 在您的帧解码器之上,那么它适用于您的整个响应。我认为这就是您要寻找的行为。

请注意,ReadTimeoutHandler 也不知道您是否已发送请求 - 它只关心是否已从套接字读取数据。如果您的连接是持久的,并且您只想在发送请求时触发读取超时,则需要构建一个请求/响应感知超时处理程序。

关于java - Netty - connectTimeoutMillis 与 ReadTimeoutHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13390363/

相关文章:

java - 使用 jQuery (GWT) 进行表单上传

java - 在Java中,如果我想创建一个通用列表或二叉搜索树,我是否可以使Node类扩展为可比较的AND列表或树类?

java - 使用 Java 打乱单词

java - 在带有代理设置的 HttpURLConnection 中使用 setReadTimeout

sql-server - SQL Server 过程超时

java - 如何使用 mongoDB 条件查询在 java 中获得更干净的代码

Netty - 调用 channel.disconnect() 实际上关闭了 channel

java - Netty TCP服务器字符变成垃圾

java - Netty 作为高性能 Http 服务器每秒可处理约 2-3 百万个请求

android - 如何处理异步任务中的连接超时