public ServerSocket(int port, int backlog) throws IOException {
this(port, backlog, null);
}
backlog 最终作用于Linux的参数 tcp_max_syn_backlog
[root@JD1 ~]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
256
[root@JD1 ~]# sysctl -a|grep tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 256
tcp_max_syn_backlog 影响的是 半连接队列和全连接队列的大小
取64和配置值中较大的哪一个。
(somaxconn 推测是 socket max connection 缩写)
[root@JD1 ~]# sysctl -a|grep net.core.somaxconn
net.core.somaxconn = 128
[root@JD1 ~]# cat /proc/sys/net/core/somaxconn
128
代码测试backlog
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerMain {
public static void main(String[] args) throws IOException {
//设置backlog为2, 最多只能有3个客户端(2个在全连接队列中+1个accept的)
ServerSocket serverSocket = new ServerSocket(8888, 2);
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
inputStream.read();
}
}
public class ClientMain {
public static void main(String[] args) throws Exception {
Socket socket = new Socket();
socket.connect(new InetSocketAddress("127.0.0.1", 8888));
InputStream inputStream = socket.getInputStream();
inputStream.read();
}
}