В моем приложении я открываю UrlConnections, и я устанавливаю время ожидания соединения. Иногда тайм-аута, но InputStream остается читаемым (и не содержат данных)ConnectTimeout не всегда блокирует чтение из входного потока?
Я успешно reproed это, используя следующий код:
System.setProperty("http.keepAlive", "false");
long length = 0;
while (length == 0) {
HttpURLConnection connection = null;
try {
connection = (HttpURLConnection) (new URL("http://www.worldofwargraphs.com").openConnection());
connection.setConnectTimeout(1); // 1ms
connection.connect();
} catch (IOException ex) {
try {
byte[] buf = new byte[8196];
try (InputStream is0 = connection.getInputStream(); InputStream is = new BufferedInputStream(is0, 8196)) {
if (is0 != null) {
int ret = 0;
while ((ret = is.read(buf)) > 0) {
length += ret;
}
}
}
} catch (IOException ex2) {
Logger.getLogger(JavaApplication6.class.getName()).log(Level.SEVERE, null, ex2);
}
}
}
System.out.println(length);
Как вы можете видеть в этом коде, я стараюсь чтобы открыть соединение с небольшим таймаутом (1 мс), чтобы убедиться, что таймауты подключения. Тогда я стараюсь читать InputStream
Дело в том, что иногда при попытке чтения потока я получаю java.net.SocketTimeoutException: connect timed out
(что я бы ожидать), но петля иногда заканчивается, показывая количество прочитанных байтов (32912)
Может ли кто-нибудь объяснить мне, почему это второе поведение иногда случается? Я попытался это сделать, но ничего не нашел об этом.
Благодаря
Вы регистрируете 'ex' после того, как поймали' ex2'? – ZhongYu
В этом примере нет необходимости, так как я использую 'ex2' для отображения, что я правильно получил исключение при попытке прочитать поток. 'ex' только здесь, чтобы войти в« catch »часть кода – Nisalon
Я имею в виду, если вызывается' ex2', вы ошибочно выполняете 'log (ex)' вместо 'log (ex2)'. поэтому вы видите «время ожидания подключения» в журнале. – ZhongYu