java serversocket參數詳解


ServerSocket有以下3個選項。

SO_TIMEOUT:表示等待客戶連接的超時時間。
SO_REUSEADDR:表示是否允許重用服務器所綁定的地址。
SO_RCVBUF:表示接收數據的緩沖區的大小。

 

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

設置該選項:public void setSoTimeOut(int timeout) throws SocketException
讀取該選項:public int getSoTimeOut() throws IOException;

 

SO_TIMEOUT表示ServerSocket的accept()方法等待客戶連接的超時時間,以毫秒為單位。如果SO_TIMEOUT的值為0,表示永遠不會超時,這是SO_TIMEOUT的默認值。

當服務器執行ServerSocket的accept()方法時,如果連接請求隊列為空,服務器就會一直等待,直到接收到了客戶連接才從accept()方法返回。如果設定了超時時間,那么當服務器等待的時間超過了超時時間,就會拋出SocketTimeoutException,它是InterruptedException的子類。

當底層的Socket實現不支持SO_TIMEOUT選項時,這兩個方法將拋出SocketException例外。不能將timeout設為負數,否則setSoTimeout方法將拋出IllegalArgumentException例外。

實例參見:http://blog.csdn.net/woshisap/article/details/6597413

 

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

設置該選項:public void setReuseAddress(boolean on) throws SocketException
讀取該選項:public boolean getReuseAddress() throws SocketException

 

該選項用來決定如果網絡上仍然有數據向舊的ServerSocket傳輸數據,是否允許新的ServerSocket綁定到與舊的ServerSocket同樣的端口上,該選項的默認值與操作系統有關,在某些操作系統中,允許重用端口,而在某些系統中不允許重用端口。

   當ServerSocket關閉時,如果網絡上還有發送到這個serversocket上的數據,這個ServerSocket不會立即釋放本地端口,而是等待一段時間,確保接收到了網絡上發送過來的延遲數據,然后再釋放端口。

     值得注意的是,public void setReuseAddress(boolean on) throws SocketException必須在ServerSocket還沒有綁定到一個本地端口之前使用,否則執行該方法無效。此外,兩個公用同一個端口的進程必須都調用serverSocket.setReuseAddress(true)方法,才能使得一個進程關閉ServerSocket之后,另一個進程的ServerSocket還能夠立刻重用相同的端口。

 

SO_RCVBUF:  接收數據的緩沖區大小

設置該選項: public void setReceiveBufferSize(int size) throws SocketException 
讀取該選項: public int getReceiveBufferSize() throws SocketException

SO_RCVBUF 表示 Socket 的用於輸入數據的緩沖區的大小. 一般說來, 傳輸大的連續的數據塊(基於HTTP 或 FTP 協議的通信) 可以使用較大的緩沖區, 這可以減少傳輸數據的次數, 提高傳輸數據的效率. 而對於交互頻繁且單次傳送數據量比較小的通信方式(Telnet 和 網絡游戲), 則應該采用小的緩沖區, 確保小批量的數據能及時發送給對方. 這種設定緩沖區大小的原則也同樣適用於 Socket 的 SO_SNDBUF 選項.

      如果底層 Socket 不支持 SO_RCVBUF 選項, 那么 setReceiveBufferSize() 方法會拋出 SocketException.

 

backlog : 輸入連接指示(對連接的請求)的最大隊列長度被設置為 backlog 參數。如果隊列滿時收到連接指示,則拒絕該連接。

 

1. backlog參數必須是大於 0 的正值。如果傳遞的值等於或小於 0,則假定為默認值。  
2. 經過測試這個隊列是按照FIFO(先進先出)的原則。 
3. 如果將accept這個函數放在一個循環體中時,backlog參數也不會有什么作用。或者簡單的講運行ServerSocket的這個線程會阻塞時,無論是在accept,還是在read處阻塞,這個backlog參數才生效。

實例參考:http://blog.csdn.net/huang_xw/article/details/7338487

 


免責聲明!

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



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