Как сохранить TCP-соединение, установленное на неопределенный срок?

Мне нужно сохранить TCP-соединение, установленное на неопределенный срок (насколько это возможно). Не является собственным сервером, поэтому мы не можем изменить способ его работы. Этот сервер нуждается в каком-то пинге каждую минуту, чтобы знать, что соединение живое. Если сервер не получает пинг через несколько минут (менее пяти), соединение и сеанс закрываются. Таким образом мне нужно поддерживать TCP-соединение с сервером и иметь возможность отправлять пинги в указанные периоды.

в момент у меня есть Android-Сервис с флагом "продолжается", поэтому Android не должен его убивать (по крайней мере, обычными процедурами). Служба android, похоже, работает нормально, и пинги отправляются периодически. Однако, когда служба работает на мобильном телефоне (не эмулятор), и он простаивает, android, кажется, заморозить службу в то время как процессор спит, поэтому TimerTask отправки пингов перестает работать и соединение идет вниз.

Я попытался заблокировать телефон от сном с частичная блокировка пробуждения, и это решает проблему, но телефон потребляет слишком много батареи,что невозможно.

Я заметил, что AlarmManager может помочь в этой задаче, поэтому я хочу запланировать сигнал тревоги для обновления запущенной службы, а затем отправить пинг. Это позволит процессору спать, а также отправлять пинг. Но график тревоги каждую минуту может быть также так потребляет батарею или нет?

Я не тестировал этот подход на данный момент, но это возможно? есть лучше способ сохранить такое TCP-соединение?. Как службы android, такие как Gmail, решают такие проблемы?

3 ответов


Мне нужно сохранить TCP-соединение, установленное на неопределенный срок с сервером.

почему?

для начала, это технически невозможно. Пользователи смогут переключаться между сетями (например, был на WiFi, не более чем на 3G), пользователи будут покидать районы, где у них есть покрытие сети, пользователей будут включаете режим полета и т. д.

на данный момент у меня есть Android-Сервис с флагом "on_course", поэтому Android не должен убивать он.

в Android нет такого понятия, как "on_course". Службы Android могут и будут убиты пользователями (Task killer, force-stop in Manage Services) или ОС. И, поскольку это будут вечные сервисы, ваши пользователи будет убейте свою службу, если они не понимают, какую ценность она постоянно доставляет.

Я попытался заблокировать телефон от засыпания с частичной блокировкой пробуждения, и это решает проблему, но телефон потребляет слишком много батареи, что неосуществимо.

правильно.

Я заметил, что AlarmManager может помочь в этой задаче, поэтому я хочу запланировать сигнал тревоги для обновления запущенной службы, а затем отправить пинг. Это позволит процессору спать, а также отправлять пинг. На данный момент я не тестировал этот подход, но это возможно?

конечно. Вы все равно будете потреблять слишком много батареи, ИМХО. Пожалуйста, позвольте вашему пользователю контролировать ваш период опроса с широким спектром опций (например, 10 минут, 30 минут, один час, никогда).

Как службы android, такие как Gmail, решают такие проблемы?

они используют C2DM, который является частью ОС и потребовал много техники, чтобы получить право. Была презентация на конференции 2010 Google I|O -- видео должно быть на YouTube. Обратите внимание, что они делают сердцебиение пинг каждые 30 минут IIRC, и они оптимизируются для случая, когда устройство находится на 3G (чтобы радио WiFi отключилось после бездействия).

Если ваша цель вашего постоянного соединения-реализовать канал связи push-style, пожалуйста, рассмотрите возможность использования C2DM.


вы можете разбудить телефон от простоя с частичной блокировкой пробуждения прямо перед выполнением ping и после этого отпустите wakelock. Это позволит научно сократить потребление батареи, и он будет делать свою работу. Кроме того, попробуйте увеличить время ping до тех пор, как вы можете.


5 минут немного короче для времени пинга, можете ли вы настроить сервер, чтобы удерживать соединение дольше? 30-минутный пинг или выше был бы идеальным. Вот пример приложения, которое содержит фоновое tcp-соединение и пробуждает устройство от глубокого сна при входящем tcp-трафике. https://github.com/schwiz/android-websocket-example