如果在連接建立後的一段時間內沒有收到數據,那麼設置超時關閉NIO SocketChannel的最佳方法是什麼?NIO SocketChannel的讀取超時?
3
A
回答
4
或者:
您使用的是
Selector
,在這種情況下,你有一個選擇超時,你可以玩,如果它熄滅(select(timeout)
返回零)關閉所有已註冊頻道,或您正在使用阻塞模式,在這種情況下,你應該能夠調用
Socket.setSoTimeout()
基礎套接字(SocketChannel.socket()
)和陷阱在SocketTimeoutException
當超時期間read()
到期時拋出,或您正在使用非阻塞模式,而不使用
Selector
,在這種情況下,您需要更改爲情況(1)。
注意,爲了使(2)工作,你需要換行通道,以獲得InputStream
,這意味着如果你使用的是阻塞模式下,你可能也只是使用Socket
。感謝@Matthieu的提示。
1
我在尋找相同的建議,無法輕鬆找到 - 在此分享。
netty有一個很好的處理程序叫做ReadTimeoutHandler。
人們可以使用它像
channel.pipeline().addLast(new ReadTimeoutHandler(readTimeout));
時沒有看到任何數據做定義讀取超時就會下降io.netty.handler.timeout.ReadTimeoutException。
相關問題
- 1. Java nio在選擇器上讀取SocketChannel
- 2. Java NIO SocketChannel讀預定義字節數
- 3. 超時上與插座使用NIO的SocketChannel
- 4. Java NIO SocketChannel寫入問題
- 5. SocketChannel保持讀取-1
- 6. 的java NIO的SocketChannel讀總是返回相同的數據
- 7. 的Java NIO的SocketChannel ISOPEN和isConnected方法
- 8. 用Java NIO /選擇器獲取讀超時的任何方法?
- 9. 爲什麼Socket使用流,但NIO SocketChannel使用讀/寫?
- 10. 的SocketChannel讀()行爲 - 短讀取
- 11. 如何在Java NIO中刷新SocketChannel?
- 12. 超時的SocketChannel不起作用
- 13. Java NIO TCP超時問題
- 14. SocketChannel - java.net.ConnectException:連接超時:連接
- 15. 如何製作的SocketChannel準備讀
- 16. 無法從SocketChannel讀取數據
- 17. Java SocketChannel寫入和讀取關聯
- 18. MySQLdb讀取超時
- 19. SocketTimeoutException:讀取超時
- 20. FILE *超時讀取
- 21. com.paypal.core.rest.PayPalRESTException:讀取超時
- 22. asio ::超時讀取
- 23. 如何讓選擇器在Java中的socketchannel鍵更改nio
- 24. 如何通過NIO中的SocketChannel發送和接收對象
- 25. Java NIO - 使用SocketChannel接收數據的問題
- 26. pcap的零讀取超時
- 27. Python-超時讀取URL時
- 28. fread超時'mod_fcgid:讀取超時管道'
- 29. SSL連接超時和讀取超時
- 30. 使用NIO VS RandomAccessFile的讀取文件
我正在使用案例1.但據我所知,如果根本沒有選擇任何通道,則會觸發select(超時)。我需要做的是關閉一個已經連接的SocketChannel,如果它在給定的時間內沒有發送任何可讀數據(即:從OP_ACCEPT改變爲OP_READ)。我有道理嗎? – Sam
當然,但你不能直接在第一種情況下這樣做。你必須跟蹤每個通道的最後讀取時間並操作選擇超時,以便最近最少讀取的通道的超時將在沒有任何事情發生時過期,檢查所有通道超時等 – EJP
將嘗試,謝謝! – Sam