java backlog满_java socket参数详解:BackLog
輸入連接指示(對連接的請求)的最大隊列長度被設置為 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。
總結
以上是生活随笔為你收集整理的java backlog满_java socket参数详解:BackLog的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 内存溢出能捕获吗_从0基础
- 下一篇: Java写手机专题分析接口_jeesit