簡體   English   中英

Socket.close() 是否被認為是結束連接的一種干凈方式?

[英]Is Socket.close() considered a clean way to end the connection?

正如標題所說 - 如果我想關閉套接字連接,只要調用mySocket.close()就足夠了嗎? 另一邊會發生什么?

或者,如果這不是要走的路,那是什么? 我是否必須通過套接字發送某種“完成”消息,以便另一方知道它也應該結束?

獎金問題:java 文檔說

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

那么僅關閉套接字就足夠了,還是我必須顯式關閉流(當然,假設我沒有使用try-with-resources )?

關閉套接字不會在另一邊做任何事情。 遠程主機不會知道連接已關閉。 檢查連接是否關閉的唯一方法是嘗試從/向輸入/輸出流讀取或寫入。 如果InputStream#read()方法返回-1 ,則第二方知道第一方關閉了連接。 拋出的IOException也指示關閉的連接。

通常,您不需要關閉輸入/輸出流,因為它們在調用Socket#close()時已關閉。 Socket#close()是關閉連接唯一需要做的事情。

但是如果您有一個包裝流(例如BufferdInputStream / BufferedOutputStream ),您應該明確關閉這些包裝流以釋放這些包裝流使用的資源(例如字節緩沖區數組)。 您只需要關閉頂級包裝流,因為關閉包裝會關閉包裝流,這也會關閉包裝流的包裝流。 等等...

socket.close()是一種關閉連接的干凈方式。 它會導致 TCP FIN 數據包發送到對等方並啟動正常的 TCP 關閉序列。

它還關閉了套接字的InputStreamOutputStream ,我在文檔中沒有看到關於這一點的任何歧義。

暫無
暫無

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

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