J'aimerais réduire le temps de conserve TCP sur une prise que j'ouvrie de 2 heures à quelque chose de l'ordre de dix minutes. Je peux le faire utiliser Keepalive avec Socket.Sekeekeealive (True), mais comment puis-je contrôler le temps avant l'envoi d'un paquet Keepalive? P>
On dirait que je pouvais le faire si j'utilisais le NDK, mais je veux distribuer ce code sous forme de pot, donc ce n'est pas idéal pour moi. P>
3 Réponses :
Ceci est probablement trop évident une réponse [c'est-à-dire Ce n'est pas une option pour votre cas spécifique] mais vous pouvez bien sûr mettre en œuvre votre propre Keepalive en envoyant un octet à deux jettes (dans les deux sens) toutes les 10 minutes. P>
Oui, je vais probablement finir par faire ça. J'entends que cela soit plus taxé sur la vie de la batterie pour le faire, cependant. Je peux définir le service Keepalive du serveur qui, espérons-le, est raisonnable.
Android est basé sur Linux, et Linux prend en charge le Ce que vous pourriez essayer de faire est d'utiliser tcp_keeditle code> tcp_keekinvl code> Options de socket via la fonction
setSocketOpt () code> la fonction, qui est enveloppée par L'interface
java.net.socktOptions code>.
java.net.socketImpl code> Implements
SocketOptions code> et
java.net.sockt code> wraps a
socketimpl code>. Ce que je ne sais pas, c'est qu'il est possible d'accéder au
socketimpl code> d'une prise code> donnée code>. P>
socket.setsocketImplactory () code> Pour implémenter votre propre
socketMplactory code> classe, qui est responsable de la création de
socketimpl code> Instances pour
socket code> objets. De cette façon, votre usine pourrait appeler
socketoption.setoption () code> pour
tcp_keeidle code> et
tcp_keeketvl code> pour toutes les prises de vue de votre application. P>
+1 Pour un indice d'utilisation de TCP_Kekeedidle et TCP_ekeeketvl dans le cas de Android. Mais Ce vote pour la mise en œuvre du niveau d'application et non du niveau système Keepalive. Quelle est votre opinion?
Cette question était spécifiquement sur le niveau de service du système, que chaque plate-forme prend en charge car elle fait partie de la SEC TCP (bien que toutes les plateformes ne prennent pas en charge la définition de l'intervalle). Le service Keepalive de niveau de l'application dépend du protocole et de nombreux protocoles ne prennent pas en charge un niveau de maintien au niveau de l'application. Si B> Un service de garde au niveau de l'application est possible, par tous les moyens l'utiliser. Mais revenez au niveau du système Keepalive si nécessaire.
Je pense que cela pourrait être Ceci fonctionne strong> au moins jusqu'à ce que strong> Les exigences suivantes forts> sont remplies: p> qui semble être vrai au moins pour les versions Android Voir Seeservalive (Boolean) Code>. Plus profondément dans la pile, ces fonctions appelle libcore.io.forwardingos.setsockoptint (...) , qui est
libcore.forwardingos.setsockoptitint / 4 code> existe à la version actuelle SDK LI>
java.net.sockt code> a un membre
Impl code> à la version SDK actuelle li>
java.net.sockt- >ac code> est une instance de
java.net.socketimpl code> à la version SDK actuelle li>
java.net.socketimpl code> a un membre
fd code> à la version SDK actuelle li>
tcp_keeditle code>,
tcp_keeketvl code> et
tcp_keekecnt code> avoir les mêmes valeurs
(
4 code>,
5 code> et
6 code>) à la version actuelle de la version SDK
Luni / SRC / MAIN / JAVA / LIBCORE / IO / OS.JAVA CODE>,
Luni / SRC / Main / Java / Java / Net / Socket.java Code> et
Luni / SRC / Main / java / java / net / socketimpl.java code> de Plate-forme / libcore référentiel .
tcp_keeditle code>,
tcp_keeketvl code> et
tcp_keekecnt code> semble avoir les mêmes valeurs pour les versions Android depuis 2.2.3 R2 et toutes les architectures. Cela peut être validé par exemple. En exécutant
trouver. -Name TCP.H | xargs grep -ho "tcp_keekee \ w \ + \ s \ + \ d \ +" | Trier | UNIQ -C code> dans le Plateforme Android / NDK référentiel. P> < / p>
Excellent! J'ai toujours pensé que Linux et Android pourraient avoir les mêmes paramètres, mais ces paramètres corrigent les problèmes que j'ai vus dans mon code Garder_alive sur Android :-) Merci beaucoup.