6

来自 Netty API 文档

connectTimeoutMillis = "连接超时,以毫秒为单位。如果禁用,则为 0。"

ReadTimeoutHandler = 在特定时间段内未读取数据时引发 ReadTimeoutException。

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

客户端将尝试连接到主机直到“connectTimeoutMillis”。如果建立了连接,并且未将 ReadTimeoutHandler 添加到管道中,则 Channel 可以无限期地等待响应。如果将 ReadTimeoutHandler 添加到管道,则一旦 timeoutSeconds 过去,就会引发 ReadTimeoutException。

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

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

4

2 回答 2

2

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

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

如果 ReadTimeoutHandler 高于您的帧解码器,则它适用于您的整个响应。我认为这是您正在寻找的行为。

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

于 2012-11-16T17:10:53.200 回答
1
  1. Yes, you have correctly identified the difference between connect timeout and read timeout. Note that whatever any documentation may say to the contrary, the default or zero connect timeout means about 60-70 seconds, not infinity, and you can only use the connect timeout parameter to reduce that default, not increase it.

  2. Read timeout starts when you call read() and ends when it expires or data arrives. It is the maximum time that read() may block waiting for the first byte to arrive. It doesn't block a second time in a single invocation.

于 2012-11-15T02:14:21.077 回答