¿Cómo mantener una conexión TCP establecida indefinidamente?

Necesito mantener una conexión TCP establecida indefinidamente (en la medida de lo posible). No es un servidor propio por lo que no podemos cambiar la forma en que funciona. Este servidor necesita algún tipo de ping cada minuto para saber que la conexión está viva. Si el servidor no recibe el ping después de algunos minutos (menos de cinco), la conexión y la sesión se cierra. De esta manera necesito mantener una conexión TCP con el servidor y ser capaz de enviar pings en los periodos especificados.

En este momento tengo un servicio de Android con la bandera "en curso" por lo que Android no debe matarlo (al menos por los procedimientos normales). El servicio Android parece funcionar bien y los pings se envían periódicamente. Sin embargo, cuando el servicio se ejecuta en un teléfono móvil (no emulador) y se vuelve inactivo, android parece congelar el servicio mientras la CPU está durmiendo, por lo que el TimerTask enviar pings dejar de funcionar y la conexión se cae.

He intentado bloquear el teléfono de ir a dormir con un bloqueo parcial de la estela y soluciona el problema, pero el teléfono consume demasiado batería, lo que es inviable.

Me di cuenta de que AlarmManager puede ayudar en esta tarea, así que quiero programar una alarma para actualizar el servicio en ejecución y luego enviar el ping. Esto permitirá que la CPU se vaya a dormir y también el ping que se envía. Pero programar una alarma cada minuto también puede ser tan batería o no?

No he probado este enfoque en este momento, pero es factible? ¿Hay una mejor manera de mantener este tipo de conexión TCP ?. ¿Cómo los servicios de Android como Gmail resuelve este tipo de problemas?

3 Solutions collect form web for “¿Cómo mantener una conexión TCP establecida indefinidamente?”

Necesito mantener una conexión TCP establecida indefinidamente con un servidor.

¿Por qué?

Para empezar, es técnicamente imposible. Los usuarios alternarán entre redes (por ejemplo, se conectó a WiFi, falló a 3G), los usuarios abandonarán las áreas en las que tienen cobertura de Internet, los usuarios activarán el modo avión, etc.

En este momento tengo un servicio de Android con la bandera "on_course" por lo que Android no debe matarlo.

No existe tal concepto como "on_course" en Android. Los servicios de Android pueden y serán asesinados por los usuarios (asesino de tareas, detención de la fuerza en Administrar servicios) o por el sistema operativo. Y, puesto que esto será un servicio eterno, sus usuarios matarán su servicio si no entienden qué valor está proporcionando continuamente.

He intentado bloquear el teléfono de ir a dormir con un bloqueo parcial de la estela y soluciona el problema, pero el teléfono consume demasiado batería, lo que es inviable.

Correcto.

Me di cuenta de que AlarmManager puede ayudar en esta tarea, así que quiero programar una alarma para actualizar el servicio en ejecución y luego enviar el ping. Esto permitirá que la CPU se vaya a dormir y también el ping que se envía. No he probado este enfoque en este momento, pero es factible?

Por supuesto. Usted todavía consumirá demasiada batería, IMHO. Permita que su usuario controle su período de votación, con una amplia gama de opciones (por ejemplo, 10 minutos, 30 minutos, una hora, nunca).

¿Cómo los servicios de Android como Gmail resuelve este tipo de problemas?

Ellos usan C2DM, que es parte del sistema operativo y tomó un montón de ingeniería para obtener la derecha. Hubo una presentación en la conferencia de Google I | O 2010 – el video debería estar en YouTube. Tenga en cuenta que hacen el pitido cada 30 minutos IIRC, y optimizar para el caso en que el dispositivo está en 3G (para permitir que la radio WiFi se apague después de la inactividad).

Si su objetivo de su conexión permanente es implementar un canal de comunicaciones push-style, considere utilizar C2DM.

Puede activar el teléfono desde el modo inactivo con el bloqueo de la sesión de bloqueo parcial justo antes de ejecutar el ping y después de hacerlo, suelte el wakelock. Se reducirá científicamente el consumo de la batería y hará el trabajo. Además, intenta aumentar el tiempo de ping tanto tiempo como puedas.

5 minutos es un poco corto para el tiempo de ping, se puede configurar el servidor para mantener la conexión más tiempo? 30 minutos de ping o más alto sería ideal. Aquí está un ejemplo de una aplicación que contiene una conexión tcp de fondo y despertará el dispositivo de un sueño profundo en el tráfico entrante tcp. https://github.com/schwiz/android-websocket-example

  • ¿Puedo usar tcpdump para obtener peticiones HTTP, encabezado de respuesta y cuerpo de respuesta?
  • ¿Por qué DefaultHttpClient envía datos a través de un socket semi-cerrado?
  • React-native-tcp no funciona en Android 7+
  • Largo tiempo de conexión TCP persistente en el Android
  • Conexión adb sobre tcp no funciona ahora
  • android Apache httpclient archivo de carga ,. tiene algún error de reensamble TCP extraño
  • Obtener la puerta de enlace predeterminada mediante programación utilizando getHostAddress () de la clase InetAddress
  • ¿Cómo puedo conectarme a Android con ADB sobre TCP?
  • No se puede usar ServerSocket en Android
  • ¿Cómo puede un emulador androide ponerse en contacto con la máquina desarrolladora del host en eclipse?
  • Transmisión de voz sobre tcp
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.