2013-06-27 128 views

回答

4

或者:

  1. 您使用的是Selector,在这种情况下,你有一个选择超时,你可以玩,如果它熄灭(select(timeout)返回零)关闭所有已注册频道,或

  2. 您正在使用阻塞模式,在这种情况下,你应该能够调用Socket.setSoTimeout()基础套接字(SocketChannel.socket())和陷阱在SocketTimeoutException当超时期间read()到期时抛出,或

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

注意,为了使(2)工作,你需要换行通道,以获得InputStream,这意味着如果你使用的是阻塞模式下,你可能也只是使用Socket。感谢@Matthieu的提示。

+0

我正在使用案例1.但据我所知,如果根本没有选择任何通道,则会触发select(超时)。我需要做的是关闭一个已经连接的SocketChannel,如果它在给定的时间内没有发送任何可读数据(即:从OP_ACCEPT改变为OP_READ)。我有道理吗? – Sam

+0

当然,但你不能直接在第一种情况下这样做。你必须跟踪每个通道的最后读取时间并操作选择超时,以便最近最少读取的通道的超时将在没有任何事情发生时过期,检查所有通道超时等 – EJP

+0

将尝试,谢谢! – Sam

1

我在寻找相同的建议,无法轻松找到 - 在此分享。

netty有一个很好的处理程序叫做ReadTimeoutHandler。

人们可以使用它像

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

时没有看到任何数据做定义读取超时就会下降io.netty.handler.timeout.ReadTimeoutException。