Семафор не ограничивает количество подключений к серверу.
Семафор ограничивает количество потоков, обращающихся к определенной части кода. Следовательно, ваш сервер будет принимать столько входящих запросов сокетов, сколько сделано, , но каждый поток сокетов будет блокироваться на семафоре.
Кроме того, ваш метод run
содержит цикл, который получает и освобождает семафор, что приводит к циклической обработке всех сокетов на семафоре.
Чтобы увидеть это в действии, добавьте несколько операторов журнала. Один до приобретения семафора, еще один сразу после его получения, другой перед выпуском и последний после его выпуска.
Так как ограничить количество подключений к серверу?
Проверьте параметр конструктора backlog
в ServerSocket
public EServer (int port)
throws IOException
{
// 'backlog' is in fact a listening queue length.
// if more than 2 socket requests are made at a time,
// they are refused. probably want to parameterize
// this :)
serverSocket = new ServerSocket (port, 2);
}