2012-11-01 22 views
6

Bật code Android của tôi (sử dụng Apache HTTP Client) tôi đã thiết lập các thông số sau:Sự khác nhau giữa ConnectionTimeoutException và SSLException với thông điệp "Connection timed out"

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

Tôi đang kết nối với một HTTPS web-dịch vụ. Trên các mạng chậm, tôi nhận được ConnectionTimeoutException sau 30 giây dự kiến ​​(và tôi thử lại sau đó); nhưng có "vài" trường hợp (không có mẫu tôi có thể quan sát), tôi nhận được một trong những:

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

Tôi có mã này từ SO, mà vẫn còn đang được thử nghiệm:

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

tôi có thể hiểu thời gian chờ của thiết lập kết nối và thời gian chờ của ổ cắm - truy vấn của tôi là chúng tôi có thực sự cần thời gian chờ thứ ba này cho SSL không? Mục đích khác với SO_TIMEOUT như thế nào?

PS: Những ngoại lệ này dường như có ảnh trong khi đọc/ghi dữ liệu - điều này sẽ dẫn đến mất dữ liệu - nhưng tôi cũng không thể quan sát được.

Trả lời

2

Sự khác biệt là ConnectionTimeoutException xảy ra khi không có kết nối nào có thể được thiết lập. Điều đó có nghĩa là máy chủ không thể truy cập được.

SSLException xảy ra khi kết nối được thiết lập nhưng trong khi bắt tay SSL, thời gian kết nối đã hết. Vì thời gian chờ xảy ra sau khi bắt tay SSL đã bắt đầu, SSLException được ném thành ngoại lệ cấp cao hơn.

Bạn có thể thử kiểm tra xem ConnectionTimeoutException có được nhập là nguyên nhân của số SSLException hay không.

Các vấn đề liên quan