2016-01-31 2 views
1

Я создаю приложение для 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). Без изменений.

Если у кого-то есть идея или опыт работы с аналогичной проблемой, пожалуйста, дайте мне знать.

+0

«новый экземпляр HttpClient необходимо создать» - если вы не используете независимую упаковку Apache для HttpClient, я предлагаю вам использовать какой-либо другой HTTP-API (например, «HttpURLConnection», OkHttp). Android отклонил HttpClient в Android 5.1, удалил его из SDK в Android 6.0 и советовал разработчикам прекратить использовать его в течение нескольких лет. Кроме того, видите ли вы что-нибудь в журналах сервера? – CommonsWare

+0

Не заглядывайте в HttpURLConnection. Я использую cz.msebera.android.httpclient. Ничего в журналах сервера. Он никогда не достигает сервера, и заголовки возвращаются в нуль при ошибке. – gh123man

+0

Вы скорректировали настройки таймаута на что? – EJP

ответ

0

Это была связанная с сеансом ошибка с кодом сервера.

+0

У меня такая же проблема, но проблема решена, как только я перезапущу устройство Android. Не могли бы вы рассказать, какая именно ошибка вашего сервера? –

+0

Проблема, с которой я столкнулся, - это проблема блокировки сеанса с PHP + Apache. Решение заключалось в вызове 'session_write_close', как только я прочитал данные, которые мне нужны из сеанса. – gh123man