2012-11-01 16 views
6

Na mojego kodu Android (przy użyciu klienta Apache HTTP) już ustawić następujące parametry:Różnica między ConnectionTimeoutException i SSLException z napisem "Connection timed out"

HttpConnectionParams.setConnectionTimeout(params, 30 * SECOND_IN_MILLIS); 
HttpConnectionParams.setSoTimeout(params, 30 * SECOND_IN_MILLIS); 

Łączę się do HTTPS internetowej serwisu. W wolnych sieciach otrzymuję ConnectionTimeoutException po oczekiwanych 30 sekundach (i wtedy ponawiam próbę); ale istnieją "kilka" przypadków (bez wzoru mogłem obserwować), pojawia się jeden z nich:

javax.net.ssl.SSLException: Read error: ssl=0xe71160: I/O error during system call, Connection timed out javax.net.ssl.SSLException: Write error: ssl=0xe71160: I/O error during system call, Broken pipe

Mam ten kod z SO, który jest jeszcze w trakcie badania:

registry.register(new Scheme("https", 
    SSLCertificateSocketFactory.getHttpSocketFactory(30 * SECOND_IN_MILLIS, null), 443)); 

I można zrozumieć limit czasu ustanowienia połączenia i limit czasu na gniazdo - moje pytanie brzmi, czy naprawdę potrzebujemy tego trzeciego limitu czasu dla protokołu SSL? Czym różni się cel od SO_TIMEOUT?

PS: Te wyjątki zdają się pojawiać na obrazie podczas odczytu/zapisu danych - co powinno spowodować utratę danych - ale tego też nie mogę zaobserwować.

Odpowiedz

2

Różnica polega na tym, że ConnectionTimeoutException występuje, gdy w ogóle nie można nawiązać połączenia. Oznacza to, że serwer nie jest w ogóle dostępny.

Numer SSLException pojawia się, gdy połączenie zostało nawiązane, ale podczas uzgadniania połączenia SSL upływają limit czasu połączenia. Ponieważ limit czasu występuje po rozpoczęciu uzgadniania SSL, SSLException jest zgłaszany jako wyjątek wyższego poziomu.

Możesz spróbować sprawdzić, czy wprowadzono ConnectionTimeoutException jako przyczynę SSLException.

Powiązane problemy