Как сохранить 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