Чому виникає виняток “java.net.ConnectException: Час очікування з’єднання закінчився”, коли URL-адреса вгору?


86

Я отримую a 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);
}

7
Будь ласка, позначте одну відповідь як прийнятну, якщо ви вирішили свою проблему :)
Тобіас,

Відповіді:


84

Час очікування підключення (припускаючи локальну мережу та декілька клієнтських машин), як правило, є результатом

а) якийсь брандмауер на шляху, який просто з'їдає пакети, не повідомляючи відправнику такі речі, як "Немає маршруту для хосту"

б) втрата пакетів через неправильну конфігурацію мережі або перевантаження лінії

в) занадто багато запитів, що перевантажує сервер

г) невелика кількість одночасно доступних потоків / процесів на сервері, що призводить до того, що всі вони приймаються. Особливо це трапляється із запитами, які виконуються тривалий час і можуть поєднуватися з в).

Сподіваюся, це допомагає.


Що допомогло мені налагодити цю проблему, це пінг-сервер, на який я робив запит. Я дізнався, що URL-адреса призначена для загальнодоступного, а не для приватного, який я призначив. Нове зіставлення у файлі / etc / hosts дозволило вирішити проблему. Я додаю коментар на випадок, якщо хтось інший зіткнеться з подібною проблемою.
Bouramas

31

Якщо URL-адреса чудово працює у веб-браузері на тій же машині, можливо, код Java не використовує проксі-сервер HTTP, який браузер використовує для підключення до URL-адреси.


6

У повідомленні про помилку сказано все: час вашого з’єднання закінчився. Це означає, що ваш запит не отримав відповіді протягом певного часу (за замовчуванням). Причини відсутності відповіді, ймовірно, є однією з таких:

а) IP / домен або порт неправильні

b) Не працює IP / домен або порт (тобто служба)

в) IP-адреса / домен займає більше часу, ніж відповідає час очікування за замовчуванням

d) У вас є брандмауер, який блокує запити чи відповіді на будь-якому порту, який ви використовуєте

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

f) Ваш доступ до Інтернету заблокований

g) Ваш Live-сервер не працює, тобто у випадку "виклику API відпочинку".

Зверніть увагу, що ваш провайдер може встановити брандмауери та блокування портів або IP


4

Я б рекомендував збільшити час очікування з’єднання перед тим, як отримати вихідний потік, приблизно так:

urlConnection.setConnectTimeout(1000);

Де 1000 - в мілісекундах (1000 мілісекунд = 1 секунда).


21
Це не підвищує його, це значно знижує. За замовчуванням це близько хвилини, і ви не можете збільшити його, ви можете лише зменшити.
Маркіз Лорнський,

3
  • спробуйте зробити Telnet, щоб побачити будь-яку проблему з брандмауером
  • виконати tracert/ tracerouteзнайти кількість стрибків

слідувати куди?
літак

очевидно, на будь-який ip, з яким ви отримували помилку.
Джон Лорд,

3

Я вирішив свою проблему за допомогою:

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

або http.proxyHost...


1

Це може бути проблемою IPv6 (хост публікує IPv6 AAAA-адресу, і хост користувачів вважає, що він налаштований на IPv6, але насправді він неправильно підключений). Це також може бути проблемою мережевого MTU, блоком брандмауера або цільовим хостом може публікувати різні IP-адреси (випадковим чином або на основі країни-виробника), до яких не всі доступні. Або подібні проблеми з мережею.

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


1

Чому виникає виняток “java.net.ConnectException: Час очікування з’єднання закінчився”, коли URL-адреса вгору?

Оскільки URLConnection (HttpURLConnection / HttpsURLConnection) є хибним. Про це ви можете прочитати тут і тут . Нашим рішенням були дві речі:

а) встановити ContentLength через setFixedLengthStreamingMode

b) вловити будь-який TimeoutException і повторити спробу, якщо це не вдалося.


0

Існує ймовірність того, що ваш IP / хост заблокований віддаленим хостом, особливо якщо він вважає, що ви занадто сильно його б'єте.


0

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

Переконайтеся, що сервер дозволяє власну IP-адресу, або ви рендеріть речі з якоїсь віддаленої URL-адреси, яка насправді існує.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.