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
SO_LINGER: 表示當執行 socket的close方法的時候,是否立即關閉底層的socket 。 這個單位是秒。
設置該選項: public void setSoLinger(boolean on, int seconds) throws SocketException;
讀取該選項:public int getSoLinger() throws SocketException
SO_LINGER選項用來控制Socket關閉時的行為,默認情況下,執行Socket的close方法,該方法會立即返回,但底層的Socket實際上并不會立即關閉,他會立即延遲一段時間,知道發送完剩余的數據,才會真正的關閉Socket,斷開連接。
setSoLinger(true, 0): 執行該方法,那么執行Socket的close方法,該方法也會立即返回,但底層的Socket也會立即關閉,所有未發送完的剩余數據被丟棄
setSoLinger(true, 3600): 那么執行Socket的close方法,該方法不會立即返回,而進入阻塞狀態,同時,底層的Socket也會嘗試發送剩余的數據,只有滿足下面的兩個條件之一,close方法才會返回:
(1):底層的Socket已經發送完所有的剩余數據
(2): 盡管底層的Socket還沒有發送完所有的剩余數據,但已經阻塞了3600秒,close()方法的阻塞時間超過3600秒,也會返回,剩余未發送的數據被丟棄。
實例參見:http://blog.csdn.net/woshisap/article/details/6576719
SO_SNFBUF: 發送數據的緩沖區大小
設置該選項: public void setSendBufferSize(int size) throws SocketException
讀取該選項: public int getSendBufferSize() throws SocketException
SO_SNDBUF 表示 Socket 的用于輸出數據的緩沖區的大小. 如果底層 Socket 不支持 SO_SNDBUF 選項, setSendBufferSize() 方法會拋出 SocketException.
對于Socket和SeverSocket如果需要指定緩沖區大小,必須在連接之前完成緩沖區的設定。
SO_KEEPLIVE: 表示對于長時間處于空閑狀態的socket,是否要自動把他關閉
設置該選項: public void setKeepAlive(boolean on) throws SocketException
讀取該選項: public boolean getKeepAlive() throws SocketException
當 SO_KEEPALIVE 選項為 true 時, 表示底層的TCP 實現會監視該連接是否有效. 當連接處于空閑狀態(連接的兩端沒有互相傳送數據) 超過了 2 小時時, 本地的TCP 實現會發送一個數據包給遠程的 Socket. 如果遠程Socket 沒有發回響應, TCP實現就會持續嘗試 11 分鐘, 直到接收到響應為止. 如果在 12 分鐘內未收到響應, TCP 實現就會自動關閉本地Socket, 斷開連接. 在不同的網絡平臺上, TCP實現嘗試與遠程Socket 對話的時限有所差別.
SO_KEEPALIVE 選項的默認值為 false, 表示TCP 不會監視連接是否有效, 不活動的客戶端可能會永遠存在下去, 而不會注意到服務器已經崩潰.
OOBINLINE: 表示是否支持發送一個字節的tcp緊急數據
設置該選項: public void setOOBInline(boolean on) throws SocketException
讀取該選項: public boolean getOOBInline() throws SocketException
當 OOBINLINE 為 true 時, 表示支持發送一個字節的 TCP 緊急數據. Socket 類的 sendUrgentData(int data) 方法用于發送一個字節的 TCP緊急數據.
OOBINLINE 的默認值為 false, 在這種情況下, 當接收方收到緊急數據時不作任何處理, 直接將其丟棄. 如果用戶希望發送緊急數據, 應該把 OOBINLINE 設為 true:
socket.setOOBInline(true);
此時接收方會把接收到的緊急數據
實例參考:http://blog.csdn.net/huang_xw/article/details/7340637
來源:
http://my.oschina.net/u/725800/blog/303634
新聞熱點
疑難解答