Java Socket 參數詳解 setKeepAlive

Java socket 編程中有個 keepalive 選項,看到這個選項經常會誤解爲長連接,不設置則爲短連接,實則不然。

socket 連接建立之後,只要雙方均未主動關閉連接,那這個連接就是會一直保持的,就是持久的連接
keepalive 只是爲了防止連接的雙方發生意外而通知不到對方,導致一方還持有連接,佔用資源

其實這個選項的意思是TCP連接空閒時是否需要向對方發送探測包,實際上是依賴於底層的TCP模塊實現的,java中只能設置是否開啓,不能設置其詳細參數,只能依賴於系統配置

keepalive 不是說TCP的長連接,當我們作爲服務端,一個客戶端連接上來,如果設置了keeplive爲 true,當對方沒有發送任何數據過來,超過一個時間(看系統內核參數配置),那麼我們這邊會發送一個ack探測包發到對方,探測雙方的TCP/IP連接是否有效(對方可能斷點,斷網)。
如果不設置,那麼客戶端宕機時,服務器永遠也不知道客戶端宕機了,仍然保存這個失效的連接。

當然,在客戶端也可以使用這個參數。客戶端Socket會每隔段的時間(大約兩個小時)就會利用空閒的連接向服務器發送一個數據包。這個數據包並沒有其它的作用,只是爲了檢測一下服務器是否仍處於活動狀態。如果服務器未響應這個數據包,在大約11分鐘後,客戶端Socket再發送一個數據包,如果在12分鐘內,服務器還沒響應,那麼客戶端Socket將關閉。如果將Socket選項關閉,客戶端Socket在服務器無效的情況下可能會長時間不會關閉。

參考:
【1】https://blog.csdn.net/huang_xw/article/details/7338663
【2】https://www.cnblogs.com/xiao-tao/p/9718017.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章