簡體   English   中英

用Java NIO /選擇器獲得讀取超時的任何方法嗎?

[英]Any way to get read timeouts with Java NIO/selectors?

我正在將使用阻塞IO和每個客戶端線程的Java服務器應用程序轉換為NIO和單個IO線程(完成基本實現后可能是線程池)。 我遇到的一件事是在客戶端閑置一段時間后斷開客戶端連接。

我以前一直在使用SO_TIMEOUT並阻止讀取。 但是,對於基於選擇器的IO,讀取不會阻塞...我希望可以設置超時並能夠選擇讀取超時,例如SelectionKey.isReadTimeout(),但沒有類似的東西似乎存在。

我想出的當前最佳解決方案是為每個正在讀取的通道設置一個帶有TimerTask的Timer,然后在發生讀取時取消並重新計划。 有更好的解決方案嗎?

我只是在看我一年前編寫的一段代碼中的處理方式。 這是我第一次使用nio東西(實際上是最后一次……從那以后我就離開了Java)。 我不知道這是否是完美的解決方案,但...

每當我從套接字讀取數據時,都會將當前時間存儲在存儲在SelectionKey.attachment()中的對象中。 我會周期性地遍歷SelectionKeys,檢查時間,並檢查超過一定時間后空閑的所有內容。

您使用計時器的解決方案是我可能會做的方式。

另一種解決方案是每次select返回時驗證每個連接。 您可以使用帶有超時參數的select方法,並將該超時調整為適合您要求的內容。 這將涉及維護有關每個連接何時最后接收到數據的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM