![](/img/trans.png)
[英]Java Sockets: Socket.close() terminates connection different on Windows and Mac?
[英]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 關閉序列。
它還關閉了套接字的InputStream
和OutputStream
,我在文檔中沒有看到關於這一點的任何歧義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.