1. public ServerSocket(int port, int backlog) throws IOException {
    2. this(port, backlog, null);
    3. }

    backlog 最终作用于Linux的参数 tcp_max_syn_backlog

    1. [root@JD1 ~]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
    2. 256
    3. [root@JD1 ~]# sysctl -a|grep tcp_max_syn_backlog
    4. net.ipv4.tcp_max_syn_backlog = 256

    tcp_max_syn_backlog 影响的是 半连接队列和全连接队列的大小

    image.png
    image.png
    取64和配置值中较大的哪一个。
    image.png
    (somaxconn 推测是 socket max connection 缩写)

    1. [root@JD1 ~]# sysctl -a|grep net.core.somaxconn
    2. net.core.somaxconn = 128
    3. [root@JD1 ~]# cat /proc/sys/net/core/somaxconn
    4. 128

    image.png
    image.png

    代码测试backlog

    1. import java.io.IOException;
    2. import java.io.InputStream;
    3. import java.net.ServerSocket;
    4. import java.net.Socket;
    5. public class ServerMain {
    6. public static void main(String[] args) throws IOException {
    7. //设置backlog为2, 最多只能有3个客户端(2个在全连接队列中+1个accept的)
    8. ServerSocket serverSocket = new ServerSocket(8888, 2);
    9. Socket accept = serverSocket.accept();
    10. InputStream inputStream = accept.getInputStream();
    11. inputStream.read();
    12. }
    13. }
    1. public class ClientMain {
    2. public static void main(String[] args) throws Exception {
    3. Socket socket = new Socket();
    4. socket.connect(new InetSocketAddress("127.0.0.1", 8888));
    5. InputStream inputStream = socket.getInputStream();
    6. inputStream.read();
    7. }
    8. }

    image.png