Как java.net.URL открывает соединение? Использует ли он сокет? - PullRequest
2 голосов
/ 05 марта 2011

Я использую следующий код для получения строки JSON из URL:

public static String getStringFromURL(String addr) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    URL url = new URL(addr);
    org.apache.commons.io.IOUtils.copy(url.openStream(), output);
    return output.toString();
}

Я хочу убедиться, что это не зависает, если по какой-либо причине страница в «addr» не работает.Я не хочу, чтобы это сломало наш сервер или что-то еще.Мы начали изучать, как java.net.URL открывает соединение, и ничего не могли сказать из Javadoc (мы используем 1.5).Любые мысли или знания будут оценены.Если вы можете ссылаться на источники, тем лучше.Спасибо!

Ответы [ 2 ]

6 голосов
/ 05 марта 2011

Технически это зависит от протокола.Для HTTP он использует сокеты TCP / IP.openStream() сгенерирует исключение, если произойдет ошибка ввода-вывода.Просто поместите это в попытку / поймать.Однако, если сервер возвращает, например, HTTP 404 (не найден) или 500 (внутренняя ошибка), вы получите эту строку в строке неосознанно.Вы можете использовать HttpURLConnection вместо этого для более детального контроля.

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

if (connection.getResponseStatus() == 200) {
    // All OK, convert connection.getInputStream() to string.
    // Don't forget to take character encoding into account!
} else {
    // Possible server error. Throw exception yourself? Or return some default?
}

Далее вы можете установить тайм-аут URLConnection#setConnectTimeout().Я считаю, что по умолчанию это 3 секунды или около того.Вы можете настроить его, чтобы сделать все быстрее.Устанавливается с 1000 на 1 секунду.

5 голосов
/ 05 марта 2011

Да, будет висеть.

Необходимо учитывать два тайм-аута:

  • Тайм-аут соединения: Сервер не может ни принимать (ACK), ни отклонять (RST) соединение, потому что оно защищено брандмауэром.Это довольно коротко и может быть установлено с помощью setConnectTimeout () ;
  • Тайм-аут, в течение которого соединение ожидает данные.Эта процедура довольно длинная (5 минут) и обычно не работает, например, если веб-приложение ожидает подключения к базе данных из пула.Его можно установить с помощью setReadTimeout ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...