Limite de conexão Java ServerSocket?

Eu estava executando alguns testes com sockets e encontrei um comportamento estranho: um ServerSocket recusará conexões depois que o 50th Socket do cliente se conectar a ele, mesmo que o soquete do cliente seja fechado antes do próximo ser aberto, e mesmo se um atraso for adicionado entre conexões.

O programa a seguir é o meu código experimental, que em seu estado atual, não gera exceções e termina normalmente. No entanto, se o tamanho da matriz deSocket[] clients é aumentado para além de 50, quaisquer soquetes de cliente que tentem se conectar após a 50ª conexão serão recusados ​​pelo soquete do servidor.

Questão:Por que 50 é a contagem em que as conexões de soquete são recusadas por um soquete de servidor?

public static void main(String[] args) {
    try (ServerSocket server = new ServerSocket(2123)) {
        Socket[] clients = new Socket[50];
        for (int i = 0; i < clients.length; i++) {
            clients[i] = new Socket("localhost", 2123);
            System.out.printf("Client %2d: " + clients[i] + "%n", i);
            clients[i].close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Eu executei testes onde outros 50 soquetes se conectam a outro servidor local, e nenhum problema ocorreu com 100 soquetes sendo abertos e fechados, então deduzi que o soquete do servidor está recusando conexões, e não algum limite de abertura de soquetes do cliente, mas Não consegui descobrir por que o soquete do servidor está limitado a 50 conexões, mesmo que elas não estejam conectadas simultaneamente.

questionAnswers(4)

yourAnswerToTheQuestion