web-dev-qa-db-fra.com

Connexions de socket et interrogation. Quelle est la meilleure solution en termes d'autonomie?

Alors ... je fais une application pour Android. L'application doit envoyer et recevoir des données de chat en temps réel (doit être une socket) mais elle doit également envoyer des commandes (ce que le client ne sait pas quand il envoie quelque chose).

J'ai besoin de savoir quelle est la meilleure solution pour économiser la batterie de l'utilisateur.

a) Ouverture et fermeture de la connexion à chaque fois qu'une commande est envoyée, si l'onglet de discussion est ouvert, maintenez la connexion constante.

b) Gardez la connexion constante tout le temps.

J'ai jeté un œil sur Internet mais j'ai obtenu des réponses mitigées, certains disent que le maintien d'une connexion persistante est mauvais pour la durée de vie de la batterie et d'autres disent que ce n'est pas le cas (Exemple: " si maintenir une connexion TCP ouverte va épuiser la durée de vie de la batterie? Peut-être que je suis loin ici, mais, maintenir une connexion ouverte ne devrait pas gaspiller la durée de vie de la batterie ... pour savoir où vous avez obtenu cette information. Cela semble SO étrange pour moi. ")

Ou s'il y a une autre solution, ce serait mieux. Je ne pense pas non plus que le C2DM de Google serait très utile dans cette situation.

Fondamentalement, qu'est-ce qui vide le plus la batterie: avoir une connexion persistante, ou ouvrir et fermer la connexion à moins que l'onglet de discussion ne soit ouvert?

Merci!

41
shadrx

Garder une connexion inactive TCP ouverte (sans qu'aucune donnée ne soit envoyée ou reçue) ne consommera (ou du moins ne devrait pas) consommer plus de batterie que de la fermer. En effet, une connexion inactive = TCP n'utilise ni bande passante ni cycles CPU (*).

Cela dit, garder une connexion TCP ouverte pendant des périodes prolongées peut ne pas être une bonne option pour un appareil mobile, car les connexions TCP n'interagissent pas bien avec les ordinateurs). qui se mettent en veille. Le scénario de problème serait le suivant: votre Android met son appareil Android en veille pendant que votre application est en cours d'exécution, puis l'utilisateur distant) Le programme (ou tout ce qui se trouve à l'autre extrémité de la connexion TCP) envoie des données via le flux TCP. Le programme de l'utilisateur distant ne récupère jamais aucun ACK de l'appareil Android, car bien sûr l'appareil Android est endormi, donc la pile TCP de l'appareil distant suppose que le = TCP les paquets qu'il a envoyés doivent avoir été perdus, et il répond en augmentant sa période de temporisation, en diminuant sa taille de fenêtre TCP (aka nombre de paquets TCP- autorisé en vol à la fois) et renvoyer les paquets TCP. Mais le périphérique Android est toujours endormi, et donc la même chose se produit ag ain. Le résultat est que quelques minutes plus tard, l'extrémité distante de la connexion TCP a ralenti au point que même si l'appareil Android Android devait se réveiller) , la connexion TCP sera probablement trop lente pour être utilisable - à quel point votre programme devra fermer la connexion TCP TCP et démarrer) un nouveau de toute façon, alors pourquoi essayer de le garder ouvert?

Donc, ma recommandation serait d'aller avec l'option (a), avec la stipulation que vous fermez la connexion TCP dans le cadre de votre routine appareil-va-dormir-maintenant).

Une mise en garde possible serait si Android a une fonctionnalité où garder une connexion TCP ouverte fait que le matériel WiFi ou de réseau cellulaire reste sous tension dans une situation où autrement, il pourrait être mis en veille - si tel est le cas, alors l'appareil Android paierait un coût de batterie pour alimenter l'antenne, qu'il n'aurait pas dû payer autrement. I Je ne suis au courant d'aucune logique Android comme celle-ci, mais je n'ai utilisé que Android un peu pour que cela puisse être de l'ignorance de ma part. Cela pourrait vaut la peine d'être testé, au moins.

(*) Eh bien, techniquement TCP envoie un paquet "keepalive" de temps en temps pendant qu'une connexion TCP est ouverte, et cela utilise certains cycles CPU et puissance de l'antenne ... mais l'intervalle par défaut pour l'envoi de paquets keepalive sur Android est deux heures , donc je doute que la puissance utilisée pour cela soit perceptible.

63
Jeremy Friesner

Afin de garder une connexion ouverte, vous devrez probablement envoyer des signaux de pulsation d'avant en arrière, car tout routeur dynamique entre le Android et vos serveurs oublieraient la connexion après une période relativement longue). peu de temps.

Ce qui est mieux dépend de combien de temps vous pensez que vous passerez sans avoir besoin de vous connecter au serveur. Si vous vous connectez environ une fois toutes les 30 secondes environ la plupart du temps, gardez la connexion ouverte, mais sinon, il vaut mieux la fermer.

1
JeffS

La batterie est très liée aux transitions d'état radio sur 3G à partir de DCH/FACH/IDLE. Si vous voulez avoir une application économe en énergie, vous devez envoyer autant de données que possible sur un intervalle de temps limité sans rapport avec une connexion persistante ou non ...

1
user2485984