ServerSocket有以下3個選項。
SO_TIMEOUT:表示等待客戶連接的超時時間。
SO_REUSEADDR:表示是否允許重用服務(wù)器所綁定的地址。
SO_RCVBUF:表示接收數(shù)據(jù)的緩沖區(qū)的大小。
SO_TIMEOUT : 表示接收數(shù)據(jù)時的等待超時時間 。 單位為毫秒,默認值為0 , 表示永遠等待。
設(shè)置該選項:public void setSoTimeOut(int timeout) throws SocketException
讀取該選項:public int getSoTimeOut() throws IOException;
SO_TIMEOUT表示ServerSocket的accept()方法等待客戶連接的超時時間,以毫秒為單位。如果SO_TIMEOUT的值為0,表示永遠不會超時,這是SO_TIMEOUT的默認值。
當服務(wù)器執(zhí)行ServerSocket的accept()方法時,如果連接請求隊列為空,服務(wù)器就會一直等待,直到接收到了客戶連接才從accept()方法返回。如果設(shè)定了超時時間,那么當服務(wù)器等待的時間超過了超時時間,就會拋出SocketTimeoutException,它是InterruptedException的子類。
當?shù)讓拥腟ocket實現(xiàn)不支持SO_TIMEOUT選項時,這兩個方法將拋出SocketException例外。不能將timeout設(shè)為負數(shù),否則setSoTimeout方法將拋出IllegalArgumentException例外。
實例參見:http://blog.csdn.net/woshisap/article/details/6597413
SO_RESUSEADDR: 表示是否允許重用socket所綁定的本地地址
設(shè)置該選項:public void setReuseAddress(boolean on) throws SocketException
讀取該選項:public boolean getReuseAddress() throws SocketException
該選項用來決定如果網(wǎng)絡(luò)上仍然有數(shù)據(jù)向舊的ServerSocket傳輸數(shù)據(jù),是否允許新的ServerSocket綁定到與舊的ServerSocket同樣的端口上,該選項的默認值與操作系統(tǒng)有關(guān),在某些操作系統(tǒng)中,允許重用端口,而在某些系統(tǒng)中不允許重用端口。
當ServerSocket關(guān)閉時,如果網(wǎng)絡(luò)上還有發(fā)送到這個serversocket上的數(shù)據(jù),這個ServerSocket不會立即釋放本地端口,而是等待一段時間,確保接收到了網(wǎng)絡(luò)上發(fā)送過來的延遲數(shù)據(jù),然后再釋放端口。
值得注意的是,public void setReuseAddress(boolean on) throws SocketException必須在ServerSocket還沒有綁定到一個本地端口之前使用,否則執(zhí)行該方法無效。此外,兩個公用同一個端口的進程必須都調(diào)用serverSocket.setReuseAddress(true)方法,才能使得一個進程關(guān)閉ServerSocket之后,另一個進程的ServerSocket還能夠立刻重用相同的端口。
SO_RCVBUF: 接收數(shù)據(jù)的緩沖區(qū)大小
設(shè)置該選項: public void setReceiveBufferSize(int size) throws SocketException
讀取該選項: public int getReceiveBufferSize() throws SocketException
SO_RCVBUF 表示 Socket 的用于輸入數(shù)據(jù)的緩沖區(qū)的大小. 一般說來, 傳輸大的連續(xù)的數(shù)據(jù)塊(基于HTTP 或 FTP 協(xié)議的通信) 可以使用較大的緩沖區(qū), 這可以減少傳輸數(shù)據(jù)的次數(shù), 提高傳輸數(shù)據(jù)的效率. 而對于交互頻繁且單次傳送數(shù)據(jù)量比較小的通信方式(Telnet 和 網(wǎng)絡(luò)游戲), 則應(yīng)該采用小的緩沖區(qū), 確保小批量的數(shù)據(jù)能及時發(fā)送給對方. 這種設(shè)定緩沖區(qū)大小的原則也同樣適用于 Socket 的 SO_SNDBUF 選項.
如果底層 Socket 不支持 SO_RCVBUF 選項, 那么 setReceiveBufferSize() 方法會拋出 SocketException.
backlog : 輸入連接指示(對連接的請求)的最大隊列長度被設(shè)置為 backlog 參數(shù)。如果隊列滿時收到連接指示,則拒絕該連接。
1. backlog參數(shù)必須是大于 0 的正值。如果傳遞的值等于或小于 0,則假定為默認值。
2. 經(jīng)過測試這個隊列是按照FIFO(先進先出)的原則。
3. 如果將accept這個函數(shù)放在一個循環(huán)體中時,backlog參數(shù)也不會有什么作用。或者簡單的講運行ServerSocket的這個線程會阻塞時,無論是在accept,還是在read處阻塞,這個backlog參數(shù)才生效。
實例參考:http://blog.csdn.net/huang_xw/article/details/7338487
新聞熱點
疑難解答