К сожалению, вы не предоставили подробную информацию о природе вашего сервера. Я полагаю, вы пишете типичный TCP-сервер. В этом ответе я не расскажу о каких-либо специфических для Java деталях.
Краткий совет: вставьте задержку между подключениями клиентов. Без этого вы активно симулируете DoS-атаку на ваш сервер.
Для более длинного, прочитайте ниже.
Обычно TCP-сервер создает только 1 прослушивания в режиме ожидания, вызывая (в прекрасном интерфейсе C) функцию int sockfd = socket(...)
и передавая результат (sockfd
в нашем случае) в bind()
и listen()
функции. После этой подготовки сервер вызовет accept()
, что приведет к сну сервера (если сокет был отмечен как блокирующий), и если клиент на другой стороне Земли начнет вызывать функцию connect()
, чем accept()
(на стороне сервера) с поддержкой ядра ОС создаст подключенный сокет .
Фактическое количество возможных ожидающих подключений можно узнать, взглянув на функцию listen()
. listen()
имеет параметр backlog , который определяет максимальное количество соединений, которое ядро OS должно ставить в очередь в сокет (это в основном сумма всех соединений в SYN_RCVD
и ESTABLISHED
состояния). Исторически рекомендованное значение для backlog в 1980-х годах было чем-то вроде 5, что в наши дни явно жалкое. Например, во FreeBSD 7.2 жесткое ограничение для отставание можно угадать, набрав:
% sysctl kern.ipc.somaxconn
kern.ipc.somaxconn: 128
и в Fedora 10:
% cat /proc/sys/net/core/somaxconn
128
P.S.
Извините за мой ужасный английский.