2010-08-06 137 views
20

我只是想知道當我們調用關閉與socket相關的inputStream和outStream時,java會做什麼。與socket上的close調用有什麼不同,例如Socket.close()。直接關閉Input/OutputStream和關閉Socket有什麼區別?

如果我們只是關閉套接字上的io流,但不關閉套接字,我們能重新打開套接字上的io流嗎?

在此先感謝!

+0

請參閱http://stackoverflow.com/questions/484925/does-closing-the-bufferedreader-printwriter-close-the-socket-connection – Istao 2010-08-06 22:54:28

回答

10

您應該關閉您從套接字創建的最外面的輸出流。這將沖洗它。關閉套接字或輸入流不會這樣做,因此它是不夠的。關閉了輸出流後,您無需執行其他任何操作。

+0

關閉輸出流==關閉套接字。 flush + fin可能無法完成,因爲在shutdownOutput – irreputable 2010-08-07 22:43:14

+3

這完全不正確。如果需要,關閉輸出流將刷新* stream *(請參閱FilterOutputStream.close()),然後關閉它和套接字。關閉socket *或*調用shutdownOutput *不會刷新套接字(即它的發送緩衝區),它只是在當前套接字發送緩衝區的末尾排隊一個FIN。除非它設置了一個積極的「逗留」超時,否則之後會發生什麼情況與關閉過程是異步的。 – EJP 2010-08-08 03:26:56

+4

我在不同的互聯網上,而不是你的?閱讀javadoc。 'shutdownOutput' - 「任何先前寫入的數據將被髮送,然後是TCP的正常連接終止序列」'getOutputStream' - 「關閉返回的OutputStream將關閉相關的套接字''close' - 關於flush和FIN沒有任何說明。 – irreputable 2010-08-08 19:28:26

17

從Java API文檔Socket

公共無效的close() 拋出IOException異常 關閉此套接字。 當前在此套接字上的I/O操作中被阻塞的任何線程都將拋出SocketException。

套接字關閉後,它不能用於其他網絡使用(即不能重新連接或反彈)。需要創建一個新的套接字。

關閉此套接字也將關閉套接字的InputStream和OutputStream。

如果此套接字有關聯的通道,那麼通道也會關閉。

關閉Socket的InputStream將導致關閉Socket。關閉Socket的OutputStream也是一樣。

從Java API文檔Socket#getInputStream()

關閉返回的InputStream將關閉關聯套接字。

查看API文檔,這是出於某種原因。

+0

所以您要說InputStream.close調用Socket.close,後者又調用InputStream.close,後者又調用Socket.close,後者又調用InputStream.close .....? – Pacerier 2012-07-15 20:41:32

+0

關閉流時關閉套接字。如果您調用InputStream.close並嘗試從套接字讀取,它將引發異常。 Socket.close關閉套接字的輸入和輸出流,在各個流上調用close並不會調用Socket.close,但仍然會導致關閉的套接字。 – Jes 2012-07-30 11:03:20

+0

當然它調用Socket.close()。 「關閉」標誌避免了無限迴歸。 – EJP 2012-08-28 18:24:42

1

這更像是一個比一個很好的答案評論:(我寧願註釋添加到一個以上的答案,但我沒有REP)

的問題,因爲我讀它,是「我可以在一個套接字上關閉一個流,然後在同一個套接字上打開一個流?「但是人們似乎在回答這個問題:」我該如何幹淨地關閉套接字?「......這不是被問到的問題。

被問到的問題的答案是「否」。關閉流時,請關閉套接字。

(我明白爲什麼在至少有一種情況下,有人可能會問這個問題,當你通過socket傳輸Java Properties時,接收端必須看到EOF識別屬性的結尾 - 要看EOF,發件人必須關閉流/套接字,但是,如果你有一個通過該套接字運行的命令/響應協議,你不想關閉它,否則你會失去你想發送響應的頻道上。請參閱Java streaming Properties over Socket處理此問題的一種方法)

+0

您關閉然後重新打開套接字並期望它保持連接的概念是沒有意義的。 – EJP 2013-10-10 23:03:09

+1

@EJP我不認爲你的評論有幫助或公平。這個「概念」不是我的,它的提問者暗示了這個概念。如果你仔細閱讀我的答案,你會看到我知道你不能關閉然後重新打開一個套接字。我已經重新回答了我的回答,因此更容易明白我的觀點。 – PMorganCA 2013-10-31 22:58:52