У меня есть простое клиент-серверное приложение, которое загружает файлы через REST API. Поскольку я использую basic http auth, файлы отправляются через ssl.Проблемы с подключением HttpsURLConnection
//my download loop
HttpsURLConnection conn;
//some handling of response codes and content-length
InputStream s = conn.getInputStream();
while (true) {
i = br.read(buffer); //if server shuts down, I stall here
if (i == -1)
break;
downloadedSize += i;
fis.write(buffer, 0, i);
}
Это все работает отлично и без проблем, пока код не сталкивается с ситуацией, когда сервер выключается передачи файлов. В то время код просто кивает, и у меня бесполезная нить.
Мой вопрос заключается в том, как обнаружить, что сервер был отключен? В Wireshark я вижу сигнал RST, но никаких исключений не возникает. Мне кажется, что это довольно обычная задача, и , но я не нашел прямого ответа на него.
В настоящее время я использую запланированную задачу, которая проверяет, были ли какие-либо прогрессы при загрузке каждые время от времени. Если он обнаруживает проблему, тогда он создает новый workThread и сообщает моей службе связи использовать ее.
Это очень уродливое решение, так как потоки затем могут стать сиротами.
Я попытался с помощью имеющихся() выглядывать, если есть какие-либо данные, но так как это SSL, он всегда возвращает 0.
Два подхода, которые я видел, это: (a) обернуть 'InputStream' в' BufferedStreamReader' и использовать метод 'ready()' или (b) перейти через 'conn', чтобы получить сокет и используйте метод getSoTimeout(). Нельзя ручаться за эффективность, хотя. – jedwards
ready() не работает, если возвращает false при использовании SSL, но я использовал решение тайм-аута. Оказывается, я установил таймаут в неподходящее время, фактически открыв соединение. conn.setReadTimeout (int milis); сделал трюк. – Radovan