Как сохранить TCP-соединение, установленное на неопределенный срок? - PullRequest
12 голосов
/ 30 июля 2011

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

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

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

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

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

Ответы [ 3 ]

11 голосов
/ 30 июля 2011

Мне нужно бесконечно устанавливать TCP-соединение с сервером.

Почему?

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

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

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

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

Исправлено.

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

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

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

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

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

2 голосов
/ 06 апреля 2012

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

1 голос
/ 18 мая 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...