Почему возникает исключение «java.net.ConnectException: истекло время ожидания соединения», если URL-адрес активен? - PullRequest
79 голосов
/ 17 сентября 2008

Я получаю ConnectException: Connection timed out с некоторой частотой из моего кода. URL, на который я пытаюсь попасть, работает. Тот же код работает для некоторых пользователей, но не для других. Кажется, что как только один пользователь начинает получать это исключение, он продолжает получать исключение.

Вот трассировка стека:

java.net.ConnectException: Connection timed out
Caused by: java.net.ConnectException: Connection timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.Socket.connect(Socket.java:516)
    at java.net.Socket.connect(Socket.java:466)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:365)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:477)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:214)
    at sun.net.www.http.HttpClient.New(HttpClient.java:287)
    at sun.net.www.http.HttpClient.New(HttpClient.java:299)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:840)

Вот фрагмент из моего кода:

URLConnection urlConnection = null;
OutputStream outputStream = null;
OutputStreamWriter outputStreamWriter = null;
InputStream inputStream = null;

try {
    URL url = new URL(urlBase);
    urlConnection = url.openConnection();
    urlConnection.setDoOutput(true);

    outputStream = urlConnection.getOutputStream(); // exception occurs on this line
    outputStreamWriter = new OutputStreamWriter(outputStream);
    outputStreamWriter.write(urlString);
    outputStreamWriter.flush();
    inputStream = urlConnection.getInputStream();
    String response = IOUtils.toString(inputStream);
    return processResponse(urlString, urlBase, response);
} catch (IOException e) {
    throw new Exception("Error querying url: " + urlString, e);
} finally {
    IoUtil.close(inputStream);
    IoUtil.close(outputStreamWriter);
    IoUtil.close(outputStream);
}

Ответы [ 9 ]

77 голосов
/ 17 сентября 2008

Тайм-ауты соединения (при условии, что локальная сеть и несколько клиентских компьютеров) обычно происходят из

а) своего рода брандмауэр на пути, который просто ест пакеты, не сообщая отправителю такие вещи, как "Нет маршрута к хосту"

b) потеря пакетов из-за неправильной конфигурации сети или перегрузки линии

в) слишком много запросов, перегружающих сервер

d) небольшое количество одновременно доступных потоков / процессов на сервере, что приводит к их использованию. Особенно это происходит с запросами, выполнение которых занимает много времени и может сочетаться с c).

Надеюсь, это поможет.

29 голосов
/ 18 сентября 2008

Если URL-адрес работает в веб-браузере на той же машине, возможно, код Java не использует HTTP-прокси, который браузер использует для подключения к URL-адресу.

5 голосов
/ 16 мая 2017

В сообщении об ошибке сказано все: время вашего соединения истекло. Это означает, что ваш запрос не получил ответа в течение некоторого (по умолчанию) срока. Причинами того, что ответ не был получен, может быть одна из:

a) IP / домен или порт неверны

b) IP / домен или порт (т.е. услуга) не работает

в) IP / домен занимает больше времени, чем ваш тайм-аут по умолчанию, чтобы ответить

d) У вас есть брандмауэр, который блокирует запросы или ответы на любом порте, который вы используете

e) У вас есть брандмауэр, который блокирует запросы к этому конкретному хосту

е) Ваш доступ в интернет недоступен

g) Ваш live-сервер не работает, т.е. в случае "вызова rest-API".

Обратите внимание, что ваш интернет-провайдер может использовать брандмауэры и блокировку портов или IP-адресов

4 голосов
/ 18 сентября 2008

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

urlConnection.setConnectTimeout(1000);

Где 1000 в миллисекундах (1000 миллисекунд = 1 секунда).

3 голосов
/ 29 ноября 2008
  • попробуйте сделать Telnet, чтобы увидеть любую проблему с брандмауэром
  • выполнить tracert / traceroute, чтобы найти количество прыжков
2 голосов
/ 01 декабря 2017

Я решил свою проблему с:

System.setProperty("https.proxyHost", "myProxy");
System.setProperty("https.proxyPort", "80");

или http.proxyHost ...

1 голос
/ 16 апреля 2014

Это может быть проблемой IPv6 (хост публикует AAvA-адрес IPv6, а хост пользователей считает, что он настроен для IPv6, но на самом деле он подключен неправильно). Это также может быть проблема сетевого MTU, блока брандмауэра или целевой хост может публиковать разные IP-адреса (случайным образом или в зависимости от страны отправителя), которые не все доступны. Или проблемы с аналогичной сетью.

Вы ничего не можете сделать, кроме установки тайм-аута и добавления хороших сообщений об ошибках (особенно распечатывания разрешенного адреса хостов). Если вы хотите сделать его более надежным, добавьте повтор, параллельные попытки всех адресов, а также изучите кэширование разрешения имен (положительное и отрицательное) на платформе Java.

0 голосов
/ 19 апреля 2016

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

Убедитесь, что либо сервер разрешает собственный IP-адрес, либо вы выводите данные с некоторого удаленного URL-адреса, который действительно существует.

0 голосов
/ 17 сентября 2008

Возможно, ваш IP / хост заблокирован удаленным хостом, особенно если он считает, что вы слишком сильно его ударили.

...