Длинный опрос Android https: невозможно получить ответ, если интервал опроса превышает 70 секунд - PullRequest
2 голосов
/ 16 января 2011

Я пытаюсь реализовать длинную push-службу опроса в моем приложении для Android (на основе Microsoft AUTD ActiveSync -> http://technet.microsoft.com/en-us/library/aa997252.aspx).

Я уже реализовал серверную часть с сервлетами 3.0, работающими на Tomcat 7.0.Я протестировал свой AsyncServlets с CURL, все работает нормально.

Вот как я протестировал мой AsyncServlet:

curl "https://webservice.mydomain.net/push?id=1&heartbeat=180000" --insecure --user user:password -D -

Ответ сервера через 3 минуты (интервал сердцебиения)

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 01:00:00 CET
Content-Type: application/json;charset=ISO-8859-1
Content-Length: 0
Date: Sat, 15 Jan 2011 23:38:57 GMT

В моем приложении для Android я использовал следующий код:

HttpParams httpParams = mDefaultHttpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParams, mHeartbeat + TIMEOUT_TOLERANCE);
mDefaultHttpClient.setParams(httpParams);

HttpGet httpGet = new HttpGet(mPushURL);
httpGet.addHeader("Accept", "application/json");

try {
    Log.i(TAG, "Executing GET(PUSH) request " + httpGet.getRequestLine());
    HttpResponse httpResponse = mDefaultHttpClient.execute(httpGet);
    Log.i(TAG, httpResponse.getStatusLine().toString());
    Log.i(TAG, convertInputStream(httpResponse.getEntity().getContent())); //For testing purposes
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

Я провел несколько тестов. Если я использую интервал сердцебиения 70 секунд, я получаю ответ. Если я использую интервал сердцебиения> 70 секунд, я получаю (после указанного интервала пульса) Исключение SocketTimeoutException вместо моего ответа HTTP 200 OK. (Для пояснения: мой набор SocketTimeout (SoTimeout) работает правильно, но, возможно, соединение теряется, я понятия не имею, почему).

Спасибо за каждый ответ.

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Используйте URLConnection и установите readTimeOut. Купить сложно сказать. Я думаю, что сетевой уровень Android замораживает открытые соединения. (Я работаю над аналогичным проектом. Не могу найти причину зависания открытых соединений)

1 голос
/ 16 марта 2011

Попробуйте добавить:

ConnManagerParams.setTimeout(params, CONNECTION_TIMEOUT);
...