Cómo obtener "SocketException: Connection reset by peer" en Android

Mi aplicación debe ponerse en contacto con el mismo dispositivo en el que está trabajando, a través de http://127.0.0.1/... (una URL localhost).

Por alguna razón, alrededor del 50% de las veces (y tal vez exactamente el 50%) cuando llego a un sitio web con contenido JSON, recibo la excepción:

Java.net.SocketException: recvfrom falló: ECONNRESET (Conexión restablecida por pares)

Para el otro 50%, obtengo resultados perfectamente buenos. He intentado hacer encuestas (e incluso un gran retraso entre las encuestas), pero sigo recibiendo los mismos resultados extraños.

He buscado en Internet y también aquí, y no estoy seguro de por qué ocurre. ¿El peer significa que el cliente lo ha causado? ¿Por qué sucede, y cómo debo manejarlo?

Algunos sitios web dicen que es algo común, pero no he encontrado cuál es la mejor cosa que hacer en estos casos.

Ok, la respuesta fue que es culpa del servidor – que tuvo que cerrar la conexión después de cada solicitud.

Podría ser que Android mantiene una piscina de conexiones y el uso de la antigua o algo así.

De todos modos, ahora funciona.


EDIT: de acuerdo con la API de HttpURLConnection , esto se puede resolver en el lado del cliente también:

Los flujos de entrada y salida devueltos por esta clase no se almacenan en búfer. La mayoría de los llamadores deben envolver los flujos devueltos con BufferedInputStream o BufferedOutputStream. Los llamantes que sólo escriben o escriben masivamente pueden omitir el almacenamiento en búfer. Al transferir grandes cantidades de datos hacia o desde un servidor, utilice los flujos para limitar cuántos datos hay en la memoria a la vez. A menos que necesite que todo el cuerpo esté en la memoria a la vez, proceselo como un flujo (en lugar de almacenar el cuerpo completo como una matriz o cadena de bytes).

Para reducir la latencia, esta clase puede reutilizar el mismo Socket subyacente para varios pares de solicitud / respuesta. Como resultado, las conexiones HTTP se pueden mantener abiertas más tiempo de lo necesario. Las llamadas a desconectar () pueden devolver el socket a un grupo de tomas conectadas. Este comportamiento se puede deshabilitar estableciendo la propiedad del sistema http.keepAlive como false antes de emitir cualquier solicitud HTTP. La propiedad http.maxConnections se puede utilizar para controlar cuántas conexiones inactivas a cada servidor se mantendrán.

Tomado de: developer.android.com/reference/java/net/HttpURLConnection.html

Intente establecer esta propiedad para su HttpURLConnection antes de conectarse:

 conn.setRequestProperty("connection", "close"); 

Esto deshabilitará la propiedad " keep-alive " que está activada de forma predeterminada.

Estaba teniendo muchas de estas Connection reset by peer cuando estaba visitando ciertas páginas web o descargando archivos (desde mi aplicación o el navegador de Android).

Resultó que era mi portadora 3G que bloqueaba las conexiones (por ejemplo, la descarga de un archivo .exe estaba prohibido).

¿Tiene el mismo problema en Wifi?

Este es un viejo hilo que conozco. Pero esto podría ayudar a alguien.

En mi caso, este error fue causado por el servicio WCF (jabón) de .NET. Uno de los objetos en el resultado de la devolución tenía una propiedad DataMember con get {} pero ninguna propiedad set {}.

Para que ocurra la serialización, cada DataMember debería tener {} y {{{{{{{{{{{{{{{{{{{{{ Implementé un conjunto vacío {} (vacío debido a mis reglas de negocio), y el problema fue resuelto.

Mi scenerio es una implementación de servidor incorrecta específica, pero tal vez ayudará a alguien a ahorrar tiempo al solucionar problemas.

System.setProperty ("http.keepAlive", "false");

En este enlace, las conexiones HTTP se describen en detalle. Pruebe este enlace (1498 + ves):

Uso de java.net.URLConnection para disparar y gestionar solicitudes HTTP

Esta excepción simplemente se plantea cuando wifi está desactivado o la conexión de datos está deshabilitada por lo tanto, la aplicación no puede conectarse al servidor.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.