Не уверен, почему возникла исключительная ситуация java.net.ConnectException: истекло время ожидания соединения: соединение - PullRequest
1 голос
/ 14 января 2011

Приведенный ниже поток находится в цикле, и он просто подключается к серверу, загружает файл, закрывает соединение и затем повторяет процесс.Приведенное ниже исключение выдается после примерно 500 итераций цикла -

java.net.ConnectException: истекло время ожидания соединения: connect

Почему это может происходить?Есть ли способ убить поток после создания исключения?

Код -

public void run() {

    boolean isExceptionThrown = false;

    try {
    while(true){

        URL url = new URL(urlString);
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

        String inputLine;

        while ((inputLine = in.readLine()) != null)
        {
            //do nothing, just want to read the file
        }

        in.close();

        ++counter;
        System.out.println("Thread id : "+this.threadId+" Connection number : "+counter +" URL : "+urlString);
        }

    }
    catch(Exception e){
        e.printStackTrace();
    }
}

Спасибо.

Ответы [ 4 ]

2 голосов
/ 14 января 2011

Проблема в том, что вы никогда не позволяете своим соединениям полностью закрыть свой Reader один раз и позволить потоку освободить ресурсы для следующего цикла while:

Возможно, слишкоммного соединений в пуле потоков, которые при создании другого 1 (в то время как другие пытаются закрыть) создают тайм-аут (это мое предположение).

Сделайте это вместо (псевдо-Java-код):

while (true) {
    BufferedReader in = null;

    try {

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (Exception ignore) {
                ignore.printStackTrace();
            }
        }

        in = null;
    }
}

Кроме того, дайте вашей теме время «очиститься», прежде чем она станет полностью свободной от активности.Попробуйте sleep / подождать, пока поток полностью закроет соединение и освободит его ресурсы.

1 голос
/ 14 января 2011

Предостережение: спекулировать здесь. Даже несмотря на то, что ваш клиентский код закрывает соединение, ваш сервер может не так быстро очищаться, поэтому ваш клиент не может установить новое соединение. Это, конечно, звучит так, как будто ~ 500 подключений отмечают, что сервер немного перегружен.

Попробуйте поставить что-то вроде сна на 10 секунд при подсчете == 400, чтобы увидеть, имеет ли это значение, сколько вы можете обработать?

1 голос
/ 14 января 2011

Возможно, сервер перегружен слишком большим количеством соединений.Даже если вы закроете поток, возможно, серверу понадобится некоторое время, чтобы закрыть сокет.

Код, который у вас есть, выйдет из цикла, как только будет сгенерировано исключение, потому что блок catch находится вне * 1004.* блок.Как только run вернется, поток умрет.

0 голосов
/ 14 января 2011

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

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

Если вы хотите быть уверены, что можете использовать что-то вроде Wireshark для проверки сетевой активности между клиентом и сервером.Вы, вероятно, заметите, что при последнем соединении вы увидите исходящие пакеты, но не входящие.

...