Я создаю приложение для Android, которое вызывает вызовы HTTP/REST api. Я сам подписал сертификат на тестирование и добавил его в свой магазин доверия к телефону.Android прерывистый SSL Socket read timed out
я столкнулся с очень странным вопросом, где я буду получать следующее исключение:
java.net.SocketTimeoutException: Read timed out
at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:705)
...
Я в полной растерянности относительно того, как и почему это происходит. Важные примечания:
- Это случается случайным образом, возвращается после многих запросов, но иногда уходит на день или два.
- Я не могу достоверно воспроизвести проблему.
- Я настроил параметры таймаута без каких-либо результатов.
- Речь идет о жизненном цикле приложения. Перезапуск приложения не имеет никакого эффекта, хотя он, кажется, разрешает себя в течение 5 минут.
- Если я использую хранилище файлов cookie, удаление его, похоже, временно разрешает проблему. Если я не использую хранилище файлов cookie, необходимо создать новый экземпляр HttpClient (поскольку файлы cookie сохраняются временно с экземпляром HttpClient)
- Это не проблема DNS, поскольку я могу разрешить конечную точку (поскольку у меня есть другое приложение, использующее одну и ту же конечную точку и тот же самый crt).
- Я использую библиотеку AsyncHttp для Android, но проблема все еще происходит за пределами использования этой библиотеки.
- Я пробовал другое устройство с другой версией Android (не повезло).
Интересные вещи я пытался:
- Я создал новый экземпляр AsyncHttp, сделал запрос (без установки CookieStore) и успешно получил ответ. Затем приложение создает другой экземпляр AsyncHttp с хранилищем файлов cookie, и проблема сохраняется. Даже вне жизненного цикла приложения первый (не приготовленный) запрос будет работать, а второй - нет.
- Я устал отключать tcp_timestamp (временно через файл в proc). Без изменений.
Если у кого-то есть идея или опыт работы с аналогичной проблемой, пожалуйста, дайте мне знать.
«новый экземпляр HttpClient необходимо создать» - если вы не используете независимую упаковку Apache для HttpClient, я предлагаю вам использовать какой-либо другой HTTP-API (например, «HttpURLConnection», OkHttp). Android отклонил HttpClient в Android 5.1, удалил его из SDK в Android 6.0 и советовал разработчикам прекратить использовать его в течение нескольких лет. Кроме того, видите ли вы что-нибудь в журналах сервера? – CommonsWare
Не заглядывайте в HttpURLConnection. Я использую cz.msebera.android.httpclient. Ничего в журналах сервера. Он никогда не достигает сервера, и заголовки возвращаются в нуль при ошибке. – gh123man
Вы скорректировали настройки таймаута на что? – EJP