HttpClient на Android: корневая причина NoHttpResponseException В моем проекте это правильно? - PullRequest
4 голосов
/ 12 декабря 2011

Я использую DefaultHttpClient для получения данных с сервера, но исключение NoHttpResponseException происходило время от времени.

Я ссылался на этот пост ссылка , а

HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false);

у меня не работает.

Я использую HttpRequestRetryHandler , чтобы избежать этой проблемы, и это работает, но я не думаю, что это идеальный метод, поскольку сетевой пакет данных сбрасывается tcpdump на сервере сторона.

Я обнаружил, что при возникновении исключения NoHttpResponseException при подключении к серверу используется новый порт вместо старого порта, использовавшегося до этого запроса (HttpClient не использует старое соединение). Но я не нашел никакого пакета данных о трехстороннем рукопожатии tcp, когда новый порт со стороны клиента соединялся со стороной сервера. Но, основываясь на теории tcp, рукопожатие является обязательным шагом при создании нового соединения.

Я не знаю, это баг андроида (я использую андроид 2.3 для тестирования), у кого-нибудь есть идея? Заранее спасибо.

1 Ответ

1 голос
/ 30 августа 2012

Я рекомендую вам проверить версию HttpClient, хотя она гораздо более широко используется, но команда HttpClient на android не поддерживается командой android. Вы, вероятно, используете старую версию. Вот шаги:

  1. Убедитесь, что вы получили последнюю версию - http://hc.apache.org/downloads.cgi
  2. Извлеките httpcomponents-client-4.2.1-bin в удобный каталог в вашей рабочей области
  3. Создайте пользовательскую библиотеку с именем «Apache HttpClient 4.2.1» и создайте ссылку в файлах .jar (также прикрепите исходные документы, если хотите) и выберите экспорт на странице «Порядок и экспорт» для библиотеки.
  4. Свяжите библиотеку с вашим проектом.



Кроме того, проверьте настройки параметров подключения. UseExpectContinue рекомендуется включать для повышения производительности в соответствии с документацией apache (см. http://hc.apache.org/httpclient-3.x/performance.html). Если вы используете HTTP_1_0 или менее, это может вызвать проблемы для вас.

Эти настройки работают для меня (обратите внимание на использование HTTP_1_1, также ваши тайм-ауты, вероятно, будут отличаться от моих):

        HttpParams params = new BasicHttpParams();

        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
        HttpProtocolParams.setUseExpectContinue(params, true);

        HttpConnectionParams.setStaleCheckingEnabled(params, false);
        HttpConnectionParams.setConnectionTimeout(params, 13000);
        HttpConnectionParams.setSoTimeout(params, 30000);
        HttpConnectionParams.setSocketBufferSize(params, 8192);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...