2012-06-26 17 views
31

La mia app deve contattare lo stesso dispositivo su cui sta lavorando, tramite http://127.0.0.1/... (un url localhost).Ottenere "SocketException: connessione ripristinata dal peer" in Android

Per qualche ragione, circa il 50% delle volte (e forse esattamente il 50%) quando raggiungo un sito web con contenuti non JSON, ottengo l'eccezione:

java.net.SocketException: recvfrom fallita : ECONNRESET (Connessione ripristinata dal peer)

Per l'altro 50%, ottengo risultati perfettamente buoni. Ho provato a fare sondaggi (e anche un grande ritardo tra i sondaggi), ma continuo a ottenere gli stessi risultati strani.

Ho cercato su internet e anche qui, e non sono sicuro del perché si verifichi. Il peer significa che il cliente l'ha causato? Perché succede e come dovrei gestirlo?

Alcuni siti web dicono che è una cosa comune, ma non ho trovato quale sia la cosa migliore da fare in questi casi.

+0

Leggilo per la spiegazione completa e la possibile risoluzione: http://stackoverflow.com/questions/30538640/javax-net-ssl-sslexception-read-error-ssl-0x9524b800-io-error-during-system?lq = 1 –

+1

Vedere anche http://stackoverflow.com/questions/1434451/what-does-connection-reset-by-peer-mean – Raedwald

risposta

18

Ok, la risposta è stata che è colpa del server - ha dovuto chiudere la connessione dopo ogni richiesta.

Potrebbe essere che Android mantiene un pool di connessioni e usa quello vecchio o qualcosa del genere.

In ogni caso, ora funziona.


EDIT: secondo l'API di HttpURLConnection, questo può essere risolto dal lato client troppo:

I flussi di ingresso e di uscita restituiti da questa classe non sono bufferizzati. La maggior parte dei chiamanti deve eseguire il wrapping dei flussi restituiti con BufferedInputStream o BufferedOutputStream. I chiamanti che eseguono solo letture o scritture di massa possono omettere il buffering. Quando si trasferiscono grandi quantità di dati da o verso un server , utilizzare gli stream per limitare la quantità di dati presenti nella memoria contemporaneamente. A meno che non sia necessario che l'intero corpo sia in memoria in una sola volta, elaborarlo come un flusso (anziché memorizzare il corpo completo come un singolo array di byte o stringa).

Per ridurre la latenza, questa classe può riutilizzare lo stesso Socket sottostante per coppie di richieste/risposte multiple . Di conseguenza, le connessioni HTTP potrebbero essere aperte a più a lungo del necessario. Le chiamate a disconnect() possono restituire il socket a un pool di socket connessi. Questo comportamento può essere disabilitato impostando la proprietà di sistema http.keepAlive su false prima di emettere eventuali richieste HTTP. La proprietà http.maxConnections può essere utilizzata per e controlla il numero di connessioni inattive per ciascun server.

Tratto da: developer.android.com/reference/java/net/HttpURLConnection.html

+3

quindi come l'hai risolto? Puoi per favore elaborare? Sto soffrendo dello stesso problema. –

+3

come scritto nel testo: "Questo comportamento può essere disabilitato impostando la proprietà di sistema http.keepAlive su false prima di inviare richieste HTTP" –

+0

OK. Grazie per la risposta. –

0

Avevo molti di questi Connection reset by peer durante la visita di determinate pagine Web o il download di file (dalla mia app o dal browser Android).

Si è scoperto che era il mio gestore 3G che ha bloccato le connessioni (ad esempio il download di un file .exe era vietato).

Hai lo stesso problema su Wifi?

+0

poiché la comunicazione è con lo stesso dispositivo, mi aspetterei che 0 problemi di comunicazione con esso a meno che non ha problemi veramente seri. non penso che abbia nulla a che fare con wifi vs 3g, ma io uso wifi. –

+0

Credo di aver frainteso la domanda. "Raggiungo un sito Web con contenuti json", intendi che raggiungi un sito Web ospitato da un server Web in esecuzione sul telefono? –

+0

sì, il dispositivo è sia un client che un server e la pagina web include solo la risposta JSON. –

1

Questo è un vecchio filo so. Ma questo potrebbe aiutare qualcuno.

Nel mio caso questo errore è stato causato dal servizio .NET WCF (soap). Uno degli oggetti nel risultato di ritorno aveva un DataMember con la proprietà get {} ma nessuna proprietà set {}.

Per la serializzazione che si verifica ogni DataMember deve avere entrambi {} & set {} disponibile. Ho implementato un set vuoto {} (vuoto a causa delle mie regole di business) e il problema è stato risolto.

Il mio scenerio è un'implementazione specifica di un server non valido, ma forse aiuterà qualcuno a risparmiare tempo durante la risoluzione dei problemi.

+0

È su sistema operativo Android ... –

+1

@androiddeveloper: il sistema operativo Android è il lato client, ma il lato server potrebbe essere qualsiasi cosa. Quindi la sua risposta potrebbe non rispondere all'OP, ma potrebbe rispondere a qualcun altro. +1 –

6

tenta di impostare questa proprietà per la HttpURLConnection prima del collegamento:

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

Questo disabiliterà "keep-alive" proprietà che è attiva per impostazione predefinita.

Problemi correlati