我有一個使用nio在Java中編寫的單線程無阻塞套接字IO服務器。異步關閉套接字通道
當我寫完連接後,我想關閉它。
通道關閉是否意味着阻止,直到接收方已確認所有緩衝的寫入操作爲止?
這將是有益的知道,當異步關閉,它成功與否,但我可以在關閉任何錯誤住被忽略。
有沒有什麼辦法來配置它,例如與setSoLinger()
(什麼設置比較合適?)
(在這方面超越Java關於Linux和其它操作系統的一般性討論將是有益的)
我有一個使用nio在Java中編寫的單線程無阻塞套接字IO服務器。異步關閉套接字通道
當我寫完連接後,我想關閉它。
通道關閉是否意味着阻止,直到接收方已確認所有緩衝的寫入操作爲止?
這將是有益的知道,當異步關閉,它成功與否,但我可以在關閉任何錯誤住被忽略。
有沒有什麼辦法來配置它,例如與setSoLinger()
(什麼設置比較合適?)
(在這方面超越Java關於Linux和其它操作系統的一般性討論將是有益的)
在非阻塞模式下關閉是非阻塞的。
你可以把通道設置爲阻塞模式,設置一個積極的逗留超時並關閉,當套接字發送緩衝區被清空時,這會阻塞直到超時超時,但是,Java不會拋出異常如果延遲超時過期,那麼您無法知道所有數據是否已經消失。我在十年前報告了這個錯誤,並且由於兼容性問題,它返回'不能修復'。如果你可以等到Java 7出來,我相信nio2的東西有這個固定的,我當然要求它,但誰知道什麼時候會這樣?
即使你有這一切,你知道的只是數據被髮送。您不知道收件人應用程序收到或處理的任何內容。如果你需要,你必須建立它到你的應用程序協議。
我不知道到底發生了什麼,但我知道, close()
包括flush()
(PrintStream
和PrintWriter
...除外)。
所以,我的方法是添加連接,關閉該隊列在第二個線程(包括錯誤處理)隊列和處理。
據我所知,你的服務器是單線程的,但第二個線程沒有花費那麼多的問題的複雜性低,解決方案將是很容易理解的任何維護。
單線程單線程單線程 – Schildmeijer 2010-10-26 07:37:47
@Schildmeijer:現實總是勝過規則。 – 2010-10-26 07:54:51
近距離的沖水似乎與傳統的IO流相似;但是渠道也是如此嗎? – Will 2010-10-26 18:46:01
非常感謝您對我的理解,我一直在尋找的確認! – Will 2010-10-29 05:24:27