2012-06-26 25 views
31

Mi aplicación necesita ponerse en contacto con el mismo dispositivo en el que está trabajando, a través de http://127.0.0.1/... (a localhost url).Obteniendo "SocketException: Connection reset by peer" en Android

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

java.net.SocketException: recvfrom falló : ECONNRESET (Restablecimiento de la conexión por pares)

Para el otro 50%, obtengo resultados perfectamente buenos. Intenté hacer encuestas (e incluso una gran demora entre las encuestas), pero sigo obteniendo los mismos resultados raros.

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

Algunos sitios web dicen que es algo común, pero no encontré qué es lo mejor que puedo hacer en estos casos.

+0

Lea esto para la explicación completa y posible resolución: http://stackoverflow.com/questions/30538640/javax-net-ssl-sslexception-read-error-ssl-0x9524b800-io-error-during-system?lq = 1 –

+1

Consulte también http://stackoverflow.com/questions/1434451/what-does-connection-reset-by-peer-mean – Raedwald

Respuesta

18

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

Puede ser que Android mantenga un grupo de conexiones y use el antiguo o algo así.

De todos modos, ahora funciona.


EDIT: de acuerdo con el API de HttpURLConnection, esto puede ser resuelto en el lado del cliente también:

Los flujos de entrada y de salida devueltos por esta clase no se almacenan temporalmente. La mayoría de los llamantes deben envolver las secuencias devueltas con BufferedInputStream o BufferedOutputStream. Las personas que llaman que solo realizan lecturas o escrituras masivas pueden omitir el almacenamiento en búfer. Al transferir grandes cantidades de datos hacia o desde un servidor , use transmisiones para limitar la cantidad de datos que hay en la memoria a la vez. A menos que necesite que todo el cuerpo esté en la memoria a la vez, procese como una secuencia (en lugar de almacenar el cuerpo completo como una matriz de 0 byte o una cadena).

Para reducir la latencia, esta clase puede reutilizar el mismo socket subyacente para pares de solicitud/respuesta múltiples. Como resultado, las conexiones HTTP pueden ser mantenidas abiertas más de lo necesario. Las llamadas para desconectar() pueden devolver el socket a un grupo de sockets conectados. Este comportamiento se puede deshabilitar estableciendo la propiedad del sistema http.keepAlive en falso antes de emitir cualquier solicitud HTTP. La propiedad http.maxConnections se puede usar para controlar cuántas conexiones inactivas se mantendrán a cada servidor.

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

+3

entonces, ¿cómo lo resolvió? ¿Puedes por favor elaborar? Estoy sufriendo con el mismo problema. –

+3

como está escrito en el texto: "Este comportamiento se puede deshabilitar estableciendo la propiedad del sistema http.keepAlive en falso antes de emitir cualquier solicitud HTTP" –

+0

Aceptar. Gracias por la respuesta. –

0

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

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

¿Tiene el mismo problema en Wifi?

+0

ya que la comunicación es con el mismo dispositivo, esperaría 0 problemas de comunicación con él a menos que tiene problemas realmente serios No creo que tenga nada que ver con wifi vs 3g, pero uso wifi. –

+0

Supongo que he entendido mal la pregunta. Cuando llego a un sitio web con contenido json, ¿quiere decir que llega a un sitio web alojado en un servidor web que se ejecuta en el teléfono? –

+0

sí, el dispositivo es tanto un cliente como un servidor, y la página web incluye solo una respuesta json. –

1

Este es un viejo hilo sé. Pero esto podría ayudar a alguien.

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

Para que se produzca la serialización, cada DataMember debe tener {} & conjunto {} disponible. Implementé un conjunto vacío {} (vacío debido a mis reglas comerciales) y el problema fue resuelto.

My scenerio es una implementación de servidor incorrecta específica, pero tal vez ayude a alguien a ahorrar tiempo al resolver problemas.

+0

Está en sistema operativo Android ... –

+1

@androiddeveloper: El sistema operativo Android es del lado del cliente, pero el lado del servidor podría ser cualquier cosa. Entonces su respuesta puede no responder al OP, pero podría responder a otra persona. +1 –

6

intenta establecer esta propiedad para su HttpURLConnection antes de conectar: ​​

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

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

Cuestiones relacionadas