java socket參數詳解:BackLog

來源:互聯網
上載者:User

輸入串連指示(對串連的請求)的最大隊列長度被設定為 backlog 參數。如果隊列滿時收到串連指示,則拒絕該串連。
注意:
1. backlog參數必須是大於 0 的正值。如果傳遞的值等於或小於 0,則假定為預設值。
2. 經過測試這個隊列是按照FIFO(先進先出)的原則。
3. 如果將accept這個函數放在一個迴圈體中時,backlog參數也不會有什麼作用。或者簡單的講運行ServerSocket的這個線程會阻塞時,無論是在accept,還是在read處阻塞,這個backlog參數才生效。
建一個ServerSocket執行個體,綁定到連接埠10000,backlog設定為2

package socket;import java.io.*;import java.net.*;import org.apache.log4j.Logger;public class Test_backlog {private static Logger logger = Logger.getLogger(Test_backlog.class);public static void main(String[] args) throws Exception {BufferedReader in = null;PrintWriter out = null;int backlog = 2;ServerSocket serversocket = new ServerSocket(10000, backlog);while (true) {logger.debug("啟動服務端......");int i;Socket socket = serversocket.accept();logger.debug("有用戶端連上服務端, 用戶端資訊如下:" + socket.getInetAddress() + " : " + socket.getPort() + ".");in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(socket.getOutputStream(), true);do {char[] c = new char[1024];i = in.read(c);logger.debug("服務端收到資訊: " + new String(c, 0, i));} while (i == -1);out.close();in.close();socket.close();logger.debug("關閉服務端......");}}}

服務端日誌:

0    [main] DEBUG socket.Test_backlog - 啟動服務端......3871 [main] DEBUG socket.Test_backlog - 有用戶端連上服務端, 用戶端資訊如下:/127.0.0.1 : 4176.18888 [main] DEBUG socket.Test_backlog - 服務端收到資訊: 發送完資訊我就斷掉。18888 [main] DEBUG socket.Test_backlog - 關閉服務端......18889 [main] DEBUG socket.Test_backlog - 啟動服務端......18890 [main] DEBUG socket.Test_backlog - 有用戶端連上服務端, 用戶端資訊如下:/127.0.0.1 : 4177.45316 [main] DEBUG socket.Test_backlog - 服務端收到資訊: 我是第二個用戶端,發完後我也斷掉。45316 [main] DEBUG socket.Test_backlog - 關閉服務端......45316 [main] DEBUG socket.Test_backlog - 啟動服務端......45317 [main] DEBUG socket.Test_backlog - 有用戶端連上服務端, 用戶端資訊如下:/127.0.0.1 : 4178.52501 [main] DEBUG socket.Test_backlog - 服務端收到資訊: 最後一個拉。52501 [main] DEBUG socket.Test_backlog - 關閉服務端......

使用TCP工具串連這個服務端

1. 當第一個用戶端串連時,服務端打出如下資訊:
6629 [main] DEBUG socket.Test_backlog - 有用戶端連上服務端, 用戶端資訊如下:/127.0.0.1 : 4110.
2. 當第二個用戶端串連時,服務端沒有打出任何東東。因為這時用戶端如果雖然顯示成功了,但是被阻在串連隊列中。
3. 當第三個用戶端串連時,情況與2相同。
4. 當第四個用戶端串連時,串連不上並報錯。因為backlog參數設定成2,隊列中只有阻塞兩個。
總結:
管理客戶串連請求的任務是由作業系統來完成的。作業系統把這些串連請求儲存在一個先進先出的隊列中。許多作業系統限定了隊列的最大長度,一般為50。當隊列中的串連請求達到了隊列的最大容量時,伺服器處理序所在的主機會拒絕新的串連請求。只有當伺服器處理序通過ServerSocket的accept()方法從隊列中取出串連請求,使隊列騰出空位時,隊列才能繼續加入新的串連請求。
對於客戶進程,如果它發出的串連請求被加入到伺服器的隊列中,就意味著客戶與伺服器的串連建立成功,客戶進程從Socket構造方法中正常返回。如果客戶進程發出的串連請求被伺服器拒絕,Socket構造方法就會拋出ConnectionException。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.