8

Android コード (Apache HTTP クライアントを使用) では、次のパラメーターを既に設定しています。

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

HTTPS Web サービスに接続しています。遅いネットワークでは、ConnectionTimeoutException予想される 30 秒後にエラーが発生します (その後、再試行します)。しかし、「少数」のケースがあり(観察できるパターンはありません)、次のいずれかが得られます。

javax.net.ssl.SSLException: 読み取りエラー: ssl=0xe71160: システム コール中の I/O エラー、接続タイムアウト javax.net.ssl.SSLException: 書き込みエラー: ssl=0xe71160: システム コール中の I/O エラー、破損パイプ

私はまだテスト中のSOからこのコードを取得しました:

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

接続確立のタイムアウトとソケットのタイムアウトを理解できます - 私の質問は、SSL にこの 3 番目のタイムアウトが本当に必要ですか? 目的は SO_TIMEOUT とどう違うのですか?

PS:これらの例外は、データの読み取り/書き込み中に発生するようです-これによりデータが失われるはずです-しかし、私はそれも観察できません。

4

1 に答える 1

3

違いは、ConnectionTimeoutException接続をまったく確立できない場合に発生することです。これは、サーバーにまったく到達できないことを意味します。

これSSLExceptionは、接続がすでに確立されているが、SSL ハンドシェーク中に接続がタイムアウトした場合に発生します。SSL ハンドシェイクが開始された後にタイムアウトが発生するため、SSLExceptionより高いレベルの例外としてスローされます。

ConnectionTimeoutExceptionの原因としてa が入力されているかどうかを確認できますSSLException

于 2012-11-10T22:41:09.113 に答える