Розетка неожиданно закрылась
Я пишу тестовую программу для сервера. В тестовом приложении я пытаюсь подключить большое количество клиентов к серверу, но через некоторое время появляются различные ошибки, подобные этим:
Connection reset by peer: socket write error
или же
java.net.SocketException: Connection reset
или же
java.net.ConnectException: Connection refused: connect
Я использую новый сокет для каждого клиента, которого я подключаю к серверу.
Может ли кто-нибудь просветить меня об этом странном поведении?
3 ответа
К сожалению, вы не предоставили подробную информацию о природе вашего сервера. Я полагаю, вы пишете типичный TCP-сервер. В этом ответе я не буду говорить о каких-либо специфических для Java деталях.
Краткий совет: вставьте задержку между подключениями клиентов. Без этого вы активно симулируете DoS-атаку на свой сервер.
Для более длинного, прочитайте ниже.
Обычно TCP-сервер создает только 1 прослушивание прослушивания при вызове (в прекрасном интерфейсе C) int sockfd = socket(...)
функция и передача результата (sockfd
в нашем случае) bind()
а также listen()
функции. После этой подготовки сервер будет вызывать accept()
который погрузит сервер в дремоту (если сокет был помечен как блокирующий) и если клиент на другой стороне Земли начнет вызывать connect()
функция, чем accept()
(на стороне сервера) при поддержке ядра ОС создаст подключенный сокет.
Фактическое количество возможных ожидающих подключения может быть известно, посмотрев на listen()
функция. listen()
имеет параметр backlog, который определяет максимальное количество соединений, которое ядро ОС должно ставить в очередь к сокету (это в основном сумма всех соединений в SYN_RCVD
а также ESTABLISHED
состояния). Исторически рекомендованным значением для отставания в 1980-х годах было что-то вроде 5, что в наши дни явно жалкое. Например, во FreeBSD 7.2 жесткое ограничение на отставание можно угадать, набрав:
% sysctl kern.ipc.somaxconn kern.ipc.somaxconn: 128
и в Fedora 10:
% cat / proc / sys / net / core / somaxconn 128
PS
Извините за мой ужасный английский.
Существуют ограничения по ОС и веб-серверу, как быстро и сколько соединений вы можете начать / принять. Если вы хотите провести тестирование производительности на сервере, попробуйте Apache JMeter, поскольку он имеет решения для этих ограничений.
Ваш веб-сервер / сервер приложений может одновременно обслуживать только ограниченное количество клиентов.
Вы получите сообщение об отказе / сбросе соединения при достижении этого предела.
Надеюсь это ответит на твой вопрос.
ура