java backlog满_java socket参数详解:BackLog
輸入連接指示(對(duì)連接的請(qǐng)求)的最大隊(duì)列長(zhǎng)度被設(shè)置為 backlog 參數(shù)。如果隊(duì)列滿時(shí)收到連接指示,則拒絕該連接。
注意:
1. backlog參數(shù)必須是大于 0 的正值。如果傳遞的值等于或小于 0,則假定為默認(rèn)值。
2. 經(jīng)過(guò)測(cè)試這個(gè)隊(duì)列是按照FIFO(先進(jìn)先出)的原則。
3. 如果將accept這個(gè)函數(shù)放在一個(gè)循環(huán)體中時(shí),backlog參數(shù)也不會(huì)有什么作用。或者簡(jiǎn)單的講運(yùn)行ServerSocket的這個(gè)線程會(huì)阻塞時(shí),無(wú)論是在accept,還是在read處阻塞,這個(gè)backlog參數(shù)才生效。
建一個(gè)ServerSocket實(shí)例,綁定到端口10000,backlog設(shè)置為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("啟動(dòng)服務(wù)端......");
int i;
Socket socket = serversocket.accept();
logger.debug("有客戶端連上服務(wù)端, 客戶端信息如下:" + 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("服務(wù)端收到信息: " + new String(c, 0, i));
} while (i == -1);
out.close();
in.close();
socket.close();
logger.debug("關(guān)閉服務(wù)端......");
}
}
}
服務(wù)端日志:
0 [main] DEBUG socket.Test_backlog - 啟動(dòng)服務(wù)端......
3871 [main] DEBUG socket.Test_backlog - 有客戶端連上服務(wù)端, 客戶端信息如下:/127.0.0.1 : 4176.
18888 [main] DEBUG socket.Test_backlog - 服務(wù)端收到信息: 發(fā)送完信息我就斷掉。
18888 [main] DEBUG socket.Test_backlog - 關(guān)閉服務(wù)端......
18889 [main] DEBUG socket.Test_backlog - 啟動(dòng)服務(wù)端......
18890 [main] DEBUG socket.Test_backlog - 有客戶端連上服務(wù)端, 客戶端信息如下:/127.0.0.1 : 4177.
45316 [main] DEBUG socket.Test_backlog - 服務(wù)端收到信息: 我是第二個(gè)客戶端,發(fā)完后我也斷掉。
45316 [main] DEBUG socket.Test_backlog - 關(guān)閉服務(wù)端......
45316 [main] DEBUG socket.Test_backlog - 啟動(dòng)服務(wù)端......
45317 [main] DEBUG socket.Test_backlog - 有客戶端連上服務(wù)端, 客戶端信息如下:/127.0.0.1 : 4178.
52501 [main] DEBUG socket.Test_backlog - 服務(wù)端收到信息: 最后一個(gè)拉。
52501 [main] DEBUG socket.Test_backlog - 關(guān)閉服務(wù)端......
使用TCP工具連接這個(gè)服務(wù)端
1. 當(dāng)?shù)谝粋€(gè)客戶端連接時(shí),服務(wù)端打出如下信息:
6629 [main] DEBUG socket.Test_backlog - 有客戶端連上服務(wù)端, 客戶端信息如下:/127.0.0.1 : 4110.
2. 當(dāng)?shù)诙€(gè)客戶端連接時(shí),服務(wù)端沒(méi)有打出任何東東。因?yàn)檫@時(shí)客戶端如果雖然顯示成功了,但是被阻在連接隊(duì)列中。
3. 當(dāng)?shù)谌齻€(gè)客戶端連接時(shí),情況與2相同。
4. 當(dāng)?shù)谒膫€(gè)客戶端連接時(shí),連接不上并報(bào)錯(cuò)。因?yàn)閎acklog參數(shù)設(shè)置成2,隊(duì)列中只有阻塞兩個(gè)。
總結(jié): 管理客戶連接請(qǐng)求的任務(wù)是由操作系統(tǒng)來(lái)完成的。操作系統(tǒng)把這些連接請(qǐng)求存儲(chǔ)在一個(gè)先進(jìn)先出的隊(duì)列中。許多操作系統(tǒng)限定了隊(duì)列的最大長(zhǎng)度,一般為50。當(dāng)隊(duì)列中的連接請(qǐng)求達(dá)到了隊(duì)列的最大容量時(shí),服務(wù)器進(jìn)程所在的主機(jī)會(huì)拒絕新的連接請(qǐng)求。只有當(dāng)服務(wù)器進(jìn)程通過(guò)ServerSocket的accept()方法從隊(duì)列中取出連接請(qǐng)求,使隊(duì)列騰出空位時(shí),隊(duì)列才能繼續(xù)加入新的連接請(qǐng)求。 對(duì)于客戶進(jìn)程,如果它發(fā)出的連接請(qǐng)求被加入到服務(wù)器的隊(duì)列中,就意味著客戶與服務(wù)器的連接建立成功,客戶進(jìn)程從Socket構(gòu)造方法中正常返回。如果客戶進(jìn)程發(fā)出的連接請(qǐng)求被服務(wù)器拒絕,Socket構(gòu)造方法就會(huì)拋出ConnectionException。
總結(jié)
以上是生活随笔為你收集整理的java backlog满_java socket参数详解:BackLog的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python 内存溢出能捕获吗_从0基础
- 下一篇: java正三角形程序怎么写,java实现