2015-03-30 9 views
12

Wir haben erfolgreich Daten von einem Webserver mit HTTP-URL für fast 2 Jahre ohne irgendwelche Schluckauf erhalten.E/A-Fehler während Systemaufruf, Verbindung durch Peer zurückgesetzt

In der letzten Zeit haben wir aus Sicherheitsgründen auf HTTPS migriert. Und das war der Zeitpunkt, an dem das Problem aufblühte.

Mit WiFi funktioniert alles gut, wenn ich regelmäßig mit 2G Pocket Daten verbinden bekomme ich Verbindung durch Server-Problem zurückgesetzt.

Ich verwende DefaultHttpClient, um eine Verbindung zum Server herzustellen.

Ich habe viele Arbeiten versucht, aber nichts hat mich gerettet.

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

  2. Ich habe alle verfügbaren Eigenschaften HttpConnectionParams angewendet

    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. Und eine andere Google-Gruppe Diskussion vorgeschlagen, dass dieses Thema eine Ursache der Idealzustand einer Tätigkeit sein könnte. Also habe ich so etwas implementiert, um den Bildschirm wach zu halten.

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

Und am onDestroy() freigegeben ich es mit wakeLock.release();

Aber auch das half nicht.

Und gibt es noch etwas, das ich am Serverende überprüfen muss?

+2

ich das gleiche Problem konfrontiert bin mit Twitter4J api ein Android-App zu entwickeln. Bei der Verwendung von WLAN funktioniert alles gut, aber wenn ich zu 2g wechseln, tritt dieses Problem häufig auf. – sahu

+0

Wie hast du das gelöst? Ich bekomme ein ähnliches Problem mit Retrofit und okhttp – Rickster

+0

Dieses Problem ist noch nicht von Android-Ende gelöst. ! Aber nur wenige arbeiten im Web-Service verringert das Verhältnis des Auftretens. Sie haben nur den Weg optimiert, den sie von der DB bekommen. – MohanRaj

Antwort

4

Ich hatte einen ähnlichen SSL-Fehler. Es stellt sich heraus, dass Pre-Lollipop-Geräte SSL TLSv1.1, TLSv1.2 nicht unterstützen. Ich habe es behoben, indem ich eine Wrapper-Klasse TLSSocketFactory eingefügt habe, die diese SSL-Protokolle aktiviert. Versuchen Sie folgendes zu Ihrem Code hinzufügen:

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

Behebt dies wirklich eine 'Verbindung zurückgesetzt durch Peer'? – EJP

+0

Ich denke, die Fehlermeldung "Verbindung durch Peer zurückgesetzt" war in Bezug auf die Ursache des Problems irreführend. Ich hatte einen identischen Fehler, und ich denke, dass die TLS-SSL-Zertifikate standardmäßig deaktiviert waren, was dazu führte, dass der Fehler "Verbindungsneustart durch Peer" nachgelagert auftritt. –

+0

Sie hatten einen identischen Fehler zu was? 'Verbindung zurückgesetzt durch Peer' oder etwas anderes? und wo kommen deaktivierte SSL-Zertifikate dazu? – EJP

Verwandte Themen