2013-06-27 64 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。