2010-10-26 147 views
4

我有一個使用nio在Java中編寫的單線程無阻塞套接字IO服務器。異步關閉套接字通道

當我寫完連接後,我想關閉它。

通道關閉是否意味着阻止,直到接收方已確認所有緩衝的寫入操作爲止?

這將是有益的知道,當異步關閉,它成功與否,但我可以在關閉任何錯誤住被忽略。

有沒有什麼辦法來配置它,例如與setSoLinger()(什麼設置比較合適?)

(在這方面超越Java關於Linux和其它操作系統的一般性討論將是有益的)

回答

3

在非阻塞模式下關閉是非阻塞的。

你可以把通道設置爲阻塞模式,設置一個積極的逗留超時並關閉,當套接字發送緩衝區被清空時,這會阻塞直到超時超時,但是,Java不會拋出異常如果延遲超時過期,那麼您無法知道所有數據是否已經消失。我在十年前報告了這個錯誤,並且由於兼容性問題,它返回'不能修復'。如果你可以等到Java 7出來,我相信nio2的東西有這個固定的,我當然要求它,但誰知道什麼時候會這樣?

即使你有這一切,你知道的只是數據被髮送。您不知道收件人應用程序收到或處理的任何內容。如果你需要,你必須建立它到你的應用程序協議。

+1

非常感謝您對我的理解,我一直在尋找的確認! – Will 2010-10-29 05:24:27

1

我不知道到底發生了什麼,但我知道, close()包括flush()PrintStreamPrintWriter ...除外)。

所以,我的方法是添加連接,關閉該隊列在第二個線程(包括錯誤處理)隊列和處理。

據我所知,你的服務器是單線程的,但第二個線程沒有花費那麼多的問題的複雜性低,解決方案將是很容易理解的任何維護。

+0

單線程單線程單線程 – Schildmeijer 2010-10-26 07:37:47

+0

@Schildmeijer:現實總是勝過規則。 – 2010-10-26 07:54:51

+1

近距離的沖水似乎與傳統的IO流相似;但是渠道也是如此嗎? – Will 2010-10-26 18:46:01