Obtenir "SocketException: réinitialisation de la connexion par les pairs" dans Android
mon application doit contacter le même périphérique sur lequel elle travaille, via http://127.0.0.1/...
(une url localhost).
Pour une raison quelconque, environ 50% du temps (et peut-être exactement 50%) lorsque j'arrive sur un site web avec le contenu JSON, je reçois l'exception:
java.net.SocketException: recvfrom failed: ECONNRESET (connexion réinitialisée par peer)
pour les autres 50%, j'obtiens de très bons résultats. J'ai essayé de faire des sondages (et même un grand délai entre les sondages), mais j'ai toujours les mêmes résultats bizarres.
j'ai cherché sur internet et aussi ici, et je ne sais pas pourquoi cela se produit. N'par les pairs, le client en est la cause? Pourquoi cela arrive - t-il, et comment dois-je le gérer?
Certains sites disent que c'est une chose commune, mais je n'ai pas trouvé quelle est la meilleure chose à faire dans de tels cas.
5 réponses
Ok, la réponse était que c'était la faute du serveur - il devait fermer la connexion après chaque requête.
il se peut que Android garde un bassin de connexions et d'utiliser l'ancien ou quelque chose comme ça.
de toute façon , maintenant ça fonctionne.
modifier: selon L'API de HttpURLConnection
, cela peut être résolu sur le côté client:
les flux d'entrée et de sortie retournés par cette classe ne sont pas tamponnés. La plupart des appelants doit envelopper les flux retournés avec BufferedInputStream ou BufferedOutputStream. Les appelants qui ne font que lire ou écrire en vrac peuvent omettre de mise en mémoire tampon. Lors du transfert de grandes quantités de données vers ou à partir d'un serveur, utilisez les flux pour limiter combien de données est en mémoire à la fois. À moins que vous ayez besoin du corps entier pour être dans la mémoire à la fois, traitez-le comme un flux (plutôt que de stocker le corps complet comme un simple tableau d'octets ou une chaîne).
Pour réduire la latence, cette classe peut réutiliser le même Socket sous-jacente pour plusieurs paires de requêtes/réponses. Par conséquent, les connexions HTTP peuvent être ouverte plus longtemps que nécessaire. Les appels à déconnecter () peuvent renvoyer le prise d'une piscine de sockets connectées. Ce comportement peut être désactivé en paramétrant le http.garder la propriété du système à false avant de l'émettre toutes les demandes HTTP. Http.la propriété maxConnections peut être utilisée pour contrôlez le nombre de connexions inactives sur chaque serveur.
tiré de: developer.android.com/reference/java/net/HttpURLConnection.html
Essayer de définir cette propriété pour votre HttpURLConnection avant de se connecter:
conn.setRequestProperty("connection", "close");
désactiver " keep-alive" de la propriété qui est activé par défaut.
C'est un vieux fil que je connais. Mais cela pourrait aider quelqu'un.
dans mon cas, cette erreur a été causée par le service.Net WCF (soap). Un des objets du résultat de retour avait un DataMember avec une propriété get{} mais pas de propriété set {}.
pour que la sérialisation se produise, chaque DataMember doit avoir les deux get {} et set{} disponibles. J'ai mis en place un ensemble vide{} (vide en raison de mes règles d'affaires), et le problème a été résolu.
Mon scenerio est un mauvais implémentation du serveur, mais peut-être que cela aidera quelqu'un à gagner du temps lors du dépannage.
j'avais beaucoup de ces Connection reset by peer
lorsque je visitais certaines pages web ou téléchargeais des fichiers (depuis mon application ou le navigateur Android).
avez-vous le même problème sur Wifi ?
dans ma situation, le problème a été résolu en nettoyant L'adresse et le port de proxy de L'APN qui a été produit par l'opérateur. comme je l'ai testé, l'utilisation de l'adresse IP du serveur distant au lieu du nom de domaine peut également résoudre le problème.