【Java TCP/IP Socket】 — close()/shutdownOutput()/shutdownInput() 的異同分析


close()/closesocket()和shutdownOutput()/shutdownInput()的區別:
確切地說,close() / closesocket() 用來關閉套接字,將套接字描述符(或句柄)從內存清除,之后再也不能使用該套接字,與C語言中的 fclose() 類似。應用程序關閉套接字后,與該套接字相關的連接和緩存也失去了意義,TCP協議會自動觸發關閉連接的操作。

 

shutdown() 用來關閉連接,而不是套接字,不管調用多少次 shutdown(),套接字依然存在,直到調用 close() / closesocket() 將套接字從內存清除。

當調用Socket.shutdownInput( )后,還能夠往該套接字中寫數據(執行OutputStream.write( ))

當調用Socket.shutdownOutput( )后,還能夠往該套接字中讀數據(執行InputStream.read( ))

 

調用 close()/closesocket() 關閉套接字時,或調用 shutdown() 關閉輸出流時,都會向對方發送 FIN 包。FIN 包表示數據傳輸完畢,計算機收到 FIN 包就知道不會再有數據傳送過來了。

默認情況下,close()/closesocket() 會立即向網絡中發送FIN包,不管輸出緩沖區中是否還有數據,而shutdown() 會等輸出緩沖區中的數據傳輸完畢再發送FIN包。也就意味着,調用 close()/closesocket() 將丟失輸出緩沖區中的數據,而調用 shutdown() 不會。

 

 

 


————————————————
版權聲明:本文為CSDN博主「seven-soft」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/softn/article/details/51563384

感謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM