Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Почему?

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

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

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

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

Правильно.

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

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

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

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

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

Ответ 2

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

Ответ 3

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