java socket 參數

Java socket參數選項:

  • TCP_NODELAY:  表示當即發送數據java

  • SO_RESUSEADDR:  表示是否容許重用socket所綁定的本地地址node

  • SO_TIMEOUT :  表示接收數據時的等待超時時間 。 單位爲毫秒,默認值爲0 , 表示永遠等待。算法

  • SO_LINGER:  表示當執行 socket的close方法的時候,是否當即關閉底層的socket 。 這個單位是秒。緩存

  • SO_SNFBUF:  發送數據的緩衝區大小服務器

  • SO_RCVBUF:  接收數據的緩衝區大小網絡

  • SO_KEEPLIVE:  表示對於長時間處於空閒狀態的socket,是否要自動把他關閉socket

  • OOBINLINE: 表示是否支持發送一個字節的tcp緊急數據tcp

  • backlog : 輸入鏈接指示(對鏈接的請求)的最大隊列長度被設置爲 backlog 參數。若是隊列滿時收到鏈接指示,則拒絕該鏈接。
    函數


詳細說明:

TCP_NODELAY:測試

  設置該選項:  public void setTcpNoDelay(boolean on) throw SocketExpcetion

  讀取該選項: public boolean getTcpNoDelay(boolean on) throw SocketExpcetion

        默認狀況下,發送數據時採用Negale算法,Negale算法是指發送方發送數據的時候不會馬上發出,而是先放在緩衝區內,等待緩衝區滿了再發送。發送完一批數據後,會等待接受方隊這批數據的迴應,而後再發送下一批數據。Negal算法適合發送方須要發送大批量數據,而且接收方會及時做出迴應的場合,這種算法經過減小傳輸數據的次數來提升通訊的效率。

        若是發送方持續的發送小批量的數據,而且接收方不必定會當即發送相應數據,那麼Negale算法會使發送方運行很慢。對已gui從新,如網絡遊戲程序(服務器須要實時跟蹤客戶端的鼠標移動),這個問題尤其突出。客戶端鼠標位置的改動的信息須要實時發送到服務器端,因爲Negale算法採用緩衝,大大下降了實時響應的速度,致使客戶端程序很慢。

      TCP_NODEALY 的默認值時 FALSE,採用Negale算法,若是設置爲 true,就好關閉socket的緩衝,確保數據及時發送出去。

  若是socket的底層不知道 tcp_nodelay 選項,那麼調用 getTcpNoDelay 和 setTcpNoDelay方法會拋出SocketException


SoTimeout

設置socket調用InputStream讀數據的超時時間,以毫秒爲單位,若是超過這個時候,會拋出java.net.SocketTimeoutException。
當輸入流的read方法被阻塞時,若是設置timeout(timeout的單位是毫秒),那麼系統在等待了timeout毫秒後會拋出一個InterruptedIOException例外。在拋出例外後,輸入流並未關閉,你能夠繼續經過read方法讀取數據。
當底層的Socket實現不支持SO_TIMEOUT選項時,這兩個方法將拋出SocketException例外。不能將timeout設爲負數,不然setSoTimeout方法將拋出IllegalArgumentException例外。

SO_RESUSEADDR 選項:


SO_LINGER

啓用/禁用具備指定逗留時間(以秒爲單位)的 SO_LINGER。最大超時值是特定於平臺的。 該設置僅影響套接字關閉。默認值爲-1,表示禁用。

這個Socket選項能夠影響close方法的行爲。在默認狀況下,當調用close方法後,將當即返回;若是這時仍然有未被送出的數據包,那麼這些數據包將被丟棄。若是將linger參數設爲一個正整數n時(n的值最大是65,535),在調用close方法後,將最多被阻塞n秒。在這n秒內,系統將盡可能將未送出的數據包發送出去;若是超過了n秒,若是還有未發送的數據包,這些數據包將所有被丟棄;而close方法會當即返回。若是將linger設爲0,和關閉SO_LINGER選項的做用是同樣的。


KeepAlive

keepalive不是說TCP的常鏈接,當咱們做爲服務端,一個客戶端鏈接上來,若是設置了keeplive爲true,當對方沒有發送任何數據過來,超過一個時間(看系統內核參數配置),那麼咱們這邊會發送一個ack探測包發到對方,探測雙方的TCP/IP鏈接是否有效(對方可能斷點,斷網)。若是不設置,那麼客戶端宕機時,服務器永遠也不知道客戶端宕機了,仍然保存這個失效的鏈接。
固然,在客戶端也可使用這個參數。客戶端Socket會每隔段的時間(大約兩個小時)就會利用空閒的鏈接向服務器發送一個數據包。這個數據包並無其它的做用,只是爲了檢測一下服務器是否仍處於活動狀態。若是服務器未響應這個數據包,在大約11分鐘後,客戶端Socket再發送一個數據包,若是在12分鐘內,服務器還沒響應,那麼客戶端Socket將關閉。若是將Socket選項關閉,客戶端Socket在服務器無效的狀況下可能會長時間不會關閉。
儘管keepalive的好處並很少,可是不少開發者提倡在更高層次的應用程序代碼中控制超時設置和死的套接字。同時須要記住,keepalive不容許你爲探測套接字終點(endpoint)指定一個值。因此建議開發者使用的另外一種比keepalive更好的解決方案是修改超時設置套接字選項

說白了:這個參數其實對應用層的程序而言沒有什麼用。能夠經過應用層實現瞭解服務端或客戶端狀態,而決定是否繼續維持該Socket。


SendBufferSize和ReceiveBufferSize

TCP發送緩存區和接收緩存區,默認是8192,通常狀況下足夠了,並且就算你增長了發送緩存區,對方沒有增長它對應的接收緩衝,那麼在TCP三握手時,最後肯定的最大發送窗口仍是雙方最小的那個緩衝區,就算你無視,發了更多的數據,那麼多出來的數據也會被丟棄。除非雙方都協商好。


backlog 選項:

說明:

輸入鏈接指示(對鏈接的請求)的最大隊列長度被設置爲 backlog 參數。若是隊列滿時收到鏈接指示,則拒絕該鏈接。 注意:  1. backlog參數必須是大於 0 的正值。若是傳遞的值等於或小於 0,則假定爲默認值。  2. 通過測試這個隊列是按照FIFO(先進先出)的原則。 3. 若是將accept這個函數放在一個循環體中時,backlog參數也不會有什麼做用。或者簡單的講運行ServerSocket的這個線程會阻塞時,不管是在accept,仍是在read處阻塞,這個backlog參數才生效。
相關文章
相關標籤/搜索