2013-03-24 6 views
0

У меня есть простое клиент-серверное приложение, которое загружает файлы через 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.

+0

Два подхода, которые я видел, это: (a) обернуть 'InputStream' в' BufferedStreamReader' и использовать метод 'ready()' или (b) перейти через 'conn', чтобы получить сокет и используйте метод getSoTimeout(). Нельзя ручаться за эффективность, хотя. – jedwards

+0

ready() не работает, если возвращает false при использовании SSL, но я использовал решение тайм-аута. Оказывается, я установил таймаут в неподходящее время, фактически открыв соединение. conn.setReadTimeout (int milis); сделал трюк. – Radovan

ответ

1

Оказалось, Ive был вызовом conn.setReadTimeout (5000); в неправильном месте

conn = getConnection(address); 
    conn.setReadTimeout(5000); 
    conn.setRequestMethod("GET"); 

Это приведет к сбою чтения().

Смежные вопросы