Задать вопрос

Входящие сообщения в сокет. Что делать?

Приветствую.
Имеется приложение, которое подключается к серверу и держит с ним соединение.
Реализовано это в виде сервиса, который запускает клиента в AsyncTask.
Если телефон засыпает, то через 5-10 минут сокет перестает получать входящие сообщения, при том, что сервер их успешно отправляет. Если "разбудить" сокет исходящим сообщением на сервер, то через какое-то время (не сразу, 5-10-15-20 секунд) до клиента долетять отправленные сообщения. Сервис будится входящими смс. Если прилетело смс - идет отправка запроса на сервер.
Для большего понимания:

Пример 1.
Запустил приложение. Подождал 5-10 минут. Отправил смс на тф. Приложение отправило запрос на сервер, сервер ответил, приложение ответ НЕ получило. Сразу отправил вторую смс - приложение отправило запрос на сервер, сервер ответил, приложение ответ ПОЛУЧИЛО.

Пример 2.
Запустил приложение. Подождал... Отправил запрос с сервера. Он не пришел. Отправил смс, запрос от приложения на сервер пришел. Сервер ответил. Через 10-15 секунд на клиент прилетает предыдущий запрос (отправленный до смс) и следом ответ от сервера.

Сломал весь мозг себе. Помогайте)

Код сервиса: pastebin.com/twKGic9X
  • Вопрос задан
  • 245 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Krost
@Krost Автор вопроса
В общем. Как мне объяснили - фундаментальная вещь сокетов: тот кто открыл соединение, тот и должен его поддерживать. Т.е. в данном случае я ограничился "пингом" (отправкой сообщения в сокет) сервера раз в минуту. Есть правда нюанс, что работает это только при подключенном к сети (usb) телефоном (до этого даже так не работало нормально), но этот вопрос я скорее всего буду решать через WAKE_LOCK.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg
Любые ответы на любые вопросы
Какую задачу-то решаем? Если "не спать" - нужно ставить wi-fi lock.
Ответ написан
Комментировать
agent10
@agent10
Software Engineer
1) Не совсем понятна тут роль смс? И как сервис будится входящими смс?
2) Попробуте выставить сокету setKeepAlive(true)
3) Как написали выше захватите PARTIAL_WAKE_LOCK, но не FULL_WAKE_LOCK

И пару вопросов?
1) Зачем вы используете AsyncTask? Почему не просто Thread?
2) Рекомендую сниффать траффик скажем WireShark'ом..так вы хоть в чём то уверены будете
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы