Как избежать исключения NoRouteToHostException?

Раскрытие информации: код, над которым я работаю, предназначен для университетских курсовых работ.

Справочная информация. Задача, которую я пытаюсь выполнить, - сообщить о влиянии различных методов потоков. Для этого я написал несколько классов, которые отвечают на запрос от клиента с помощью сокетов Java. Идея состоит в том, чтобы заполнить сервер запросами и сообщить о том, как разные стратегии потоков справляются с этим. Каждый клиент будет делать 100 запросов, и в каждой итерации мы увеличиваем количество клиентов на 50, пока что-то не сломается.

Проблема: неоднократно и последовательно возникает исключение:

Caused by: java.net.NoRouteToHostException: Cannot assign requested address
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)

Это происходит в нескольких сценариях, в том числе когда клиент и сервер работают на локальном хосте. Соединение может быть успешно установлено на некоторое время, и вскоре после попытки подключить 150 клиентов выдается исключение.

Моей первой мыслью было, что это может быть ограничение Linux на дескрипторы открытых файлов (1024), но я так не думаю. Я также проверил, что все соединения между розетками закрыты должным образом (т.е. в пределах правильногоfinally блок).

Я не решаюсь опубликовать код, потому что я не уверен, какие части будут наиболее релевантными, и не хочу, чтобы в этом вопросе содержался огромный список кода.

Кто-нибудь сталкивался с этим раньше? Как я могу избежать исключения NoRouteToHostException?

РЕДАКТИРОВАТЬ (дополнительные вопросы выделены курсивом)

Пока есть несколько хороших ответов, которые указывают либо на эфемерный диапазон портов, либо на RFC 2780. Оба из них предполагают, что у меня слишком много открытых соединений. Для обоих случаев количество подключений, которое необходимо установить, чтобы достичь этого предела, говорит о том, что в какой-то момент я не закрываю подключения.

После отладки клиента и сервера было обнаружено, что оба ударили по вызову методаmyJava-Net-SocketInstance.close(), Это предполагает, что соединения закрываются (по крайней мере, в неисключительном случае).Это правильное предложение?

Также,Требуется ли ожидание уровня ОС, чтобы порты снова стали доступны? Это даст возможность запускать программу отдельно для каждых 50+ клиентов, если для выполнения следующей попытки потребуется просто короткий период (или оптимистично, выполнение команды).

РЕДАКТИРОВАТЬ v2.0

Получив хорошие ответы, я изменил свой код для использования метода setReuseAddress (true) с каждым подключением Socket, установленным на клиенте. Это не дало желаемого эффекта, и я все еще ограничен 250-300 клиентами. После завершения программы, запустив командуnetstat -a показывает, что в состоянии TIME_WAIT много сокетных соединений.

Я предположил, что если розетка была вTIME-WAIT статус, и был установлен сSO-REUSEADDR вариант, любые новые сокеты, пытающиеся использовать этот порт, смогут - однако я все еще получаю NoRouteToHostException.

Это верно? Есть ли что-нибудь еще, что можно сделать, чтобы решить эту проблему?

Ответы на вопрос(6)

Ваш ответ на вопрос