2015-03-30 5 views
12

Abbiamo recuperato con successo dati da un server Web con URL HTTP per quasi 2 anni senza alcun problema.Errore I/O durante la chiamata di sistema, Connessione ripristinata dal peer

Nel passato recente abbiamo migrato a HTTPS per qualche motivo di sicurezza. E questo è quando il problema è sbocciato.

Con WiFi funziona tutto bene, quando mi collego a dati pocket 2G periodicamente sto ricevendo il reset della connessione dal problema del server.

Sto utilizzando DefaultHttpClient per connettersi al server.

Ho provato molte cose in giro ma nulla mi ha salvato.

  1. javax.net.ssl.SSLException: Read error: ssl=0x56e63588: I/O error during system call, Connection reset by peer

  2. ho applicato tutte le proprietà disponibili per HttpConnectionParams

    HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),120000); 
    HttpConnectionParams.setSoTimeout(httpClient.getParams(), 120000); 
    HttpConnectionParams.setLinger(httpClient.getParams(), 120000); 
    HttpConnectionParams.setTcpNoDelay(httpClient.getParams(), true); 
    HttpConnectionParams.setStaleCheckingEnabled(httpClient.getParams(), false); 
    
  3. E un altro gruppo di discussione di Google hanno suggerito che questo problema potrebbe essere una causa di stato ideale di un'attività. Quindi ho implementato qualcosa di simile per mantenere lo schermo sveglio.

    powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK,"My Tag"); 
    wakeLock.acquire(); 
    

E alla onDestroy() ho rilasciato con wakeLock.release();

Ma anche questo non ha aiutato.

E c'è qualcos'altro che devo controllare alla fine del server?

+2

Sto affrontando lo stesso problema usando twitter4j API per lo sviluppo di un'applicazione Android. Mentre si utilizza il wifi, tutto funziona correttamente ma quando si passa a 2g, questo problema si verifica spesso. – sahu

+0

Come hai risolto questo? Sto riscontrando un problema simile con il retrofit e okhttp – Rickster

+0

Questo problema non è stato ancora risolto da Android. ! Ma pochi interventi nel servizio web hanno ridotto il rapporto di occorrenza. Hanno semplicemente ottimizzato il modo in cui recuperano dal DB. – MohanRaj

risposta

4

Stavo avendo un errore SSL simile. Risulta che i dispositivi pre-lollipop non supportano SSL TLSv1.1, TLSv1.2. L'ho risolto includendo una classe wrapper TLSSocketFactory che abilita questi protocolli SSL. Prova ad aggiungere il seguente al codice:

static { 
    final SSLSocketFactory sslSocketFactory; 
    try { 
     sslSocketFactory = new TLSSocketFactory(); 
     HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory); 
    } catch (KeyManagementException ignored) { 

    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
} 

import java.io.IOException; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.security.KeyManagementException; 
import java.security.NoSuchAlgorithmException; 

import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSocket; 
import javax.net.ssl.SSLSocketFactory; 

/** 
* @author fkrauthan 
* http://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/ 
* 
* 
// IMPORTANT: Pre-lollipop devices do not support SSL TLSv1.1, TLSv1.2 
// so I've included a TLSSocketFactory wrapper class that enables these SSL 
// protocols. 
*/ 
public class TLSSocketFactory extends SSLSocketFactory { 

    private SSLSocketFactory internalSSLSocketFactory; 

    public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException { 
     SSLContext context = SSLContext.getInstance("TLS"); 
     context.init(null, null, null); 
     internalSSLSocketFactory = context.getSocketFactory(); 
    } 

    @Override 
    public String[] getDefaultCipherSuites() { 
     return internalSSLSocketFactory.getDefaultCipherSuites(); 
    } 

    @Override 
    public String[] getSupportedCipherSuites() { 
     return internalSSLSocketFactory.getSupportedCipherSuites(); 
    } 

    @Override 
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)); 
    } 

    @Override 
    public Socket createSocket(String host, int port) throws IOException, UnknownHostException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); 
    } 

    @Override 
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); 
    } 

    @Override 
    public Socket createSocket(InetAddress host, int port) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); 
    } 

    @Override 
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); 
    } 

    private Socket enableTLSOnSocket(Socket socket) { 
     if(socket != null && (socket instanceof SSLSocket)) { 
      ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"}); 
     } 
     return socket; 
    } 
} 
+0

Questo risolve davvero una 'connessione ripristinata dal peer'? – EJP

+0

Penso che il messaggio di errore "connessione ripristinata dal peer" era fuorviante in termini di causa del problema. Ho riscontrato un errore identico e penso che i certificati SSL TLS siano stati disabilitati per impostazione predefinita, causando l'errore "connessione ripristinata dal peer" a verificarsi a valle. –

+0

Hai avuto un errore identico a cosa? 'Connessione ripristinata dal peer' o qualcos'altro? e dove entrano i certificati SSL disabilitati? – EJP