【问题标题】:Read timeout for an NIO SocketChannel? [duplicate]NIO SocketChannel 的读取超时? [复制]
【发布时间】:2013-06-27 10:41:21
【问题描述】:

如果在连接建立后的一段时间内没有收到数据,设置超时关闭 NIO SocketChannel 的最佳方法是什么?

【问题讨论】:

    标签: java nio socketchannel


    【解决方案1】:

    要么:

    1. 您正在使用Selector,在这种情况下,您可以使用选择超时,如果超时(select(timeout) 返回零)关闭所有已注册的频道,或者

    2. 您正在使用阻塞模式,在这种情况下,您可能认为您应该能够在底层套接字 (SocketChannel.socket()) 上调用 Socket.setSoTimeout(),并捕获超时到期时抛出的 SocketTimeoutExceptionread() 期间,但你不能,因为它不支持作为通道发起的套接字,或者

    3. 您正在使用没有Selector 的非阻塞模式,在这种情况下,您需要更改为情况(1)。

    因此,您要么需要使用 case (1),要么直接使用 java.net.Socket

    【讨论】:

    • 我使用的是案例 1。但据我了解,如果根本没有选择任何频道,则会触发 select(timeout)。我需要做的是关闭已经连接的 SocketChannel,如果它在给定时间内没有发送任何可读数据(即从 OP_ACCEPT 更改为 OP_READ)。我说得通吗?
    • 当然,但在情况 1 中您不能直接这样做。您必须跟踪每个通道的最后读取时间并操纵选择超时,以便最近最少读取的通道超时将过期如果没有任何反应,请检查所有通道是否超时等。
    • 试试,谢谢!
    • 对不起,您所说的“操纵选择超时”是什么意思?
    • 根据this previous question case #2 将不起作用。它有一个答案显示如何做到这一点。
    【解决方案2】:

    我正在寻找相同的建议,但无法轻松找到 - 在这里分享。

    netty 有一个不错的处理程序,称为:ReadTimeoutHandler。

    可以这样使用

    channel.pipeline().addLast(new ReadTimeoutHandler(readTimeout));
    

    当未能看到任何执行定义的读取超时的数据时,它将丢弃 io.netty.handler.timeout.ReadTimeoutException。

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2011-02-23
      • 2011-08-17
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      相关资源
      最近更新 更多