15

We have been successfully fetching data from a web server with HTTP url for almost 2 years without any hiccups.

In recent past we have migrated to HTTPS for some security reason.And that's when the problem blossomed.

With WiFi everything works fine,When I connect to 2G pocket data periodically I'm getting connection reset by server issue.

I'm using DefaultHttpClient to connect to the server.

I have tried many work around but nothing rescued me.

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

  2. I have applied all the available properties to 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. And another google group discussion suggested that this issue could be a cause of ideal state of an activity.So I implemented something like this to keep the screen awake.

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

And at the onDestroy() I released it with wakeLock.release();

But that too didn't help.

And is there is anything else I need to check at server end?

Community
  • 1
  • 1
MohanRaj
  • 662
  • 1
  • 6
  • 21
  • 2
    I am facing the same problem using twitter4j api for developing an android app. While using wifi everything works fine but when I switch to 2g then this problem occurs frequently. – Pranjal Sahu Apr 19 '15 at 12:22
  • How did you solve this? I'm getting a similar problem with retrofit and okhttp – Rickster May 28 '15 at 07:17
  • This issue is not yet solved from android end. ! But few work around in web service decreased the ratio of occurrence. They just optimized the way they fetch from DB. – MohanRaj May 30 '15 at 11:27
  • Is this still a live question? Or is this issue long since dealt with? – jfriend00 May 22 '16 at 08:54
  • It's still unresolved ! – MohanRaj Jun 19 '16 at 09:47
  • There is probably never going to be no fix for this because Android is trying to conserve battery and bandwidth over cellular; thusly adjusting the type of signals it sends over 2G. Whatever its doing, the KEEP ALIVE is probably being violated on the remote side and it thinks the cellular device silently disconnected. – Johnny V Aug 07 '16 at 14:03

1 Answers1

6

I was having a similar SSL error. Turns out Pre-lollipop devices do not support SSL TLSv1.1, TLSv1.2. I fixed it by including a TLSSocketFactory wrapper class that enables these SSL protocols. Try adding the following to your code:

    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;
    }
}
Clark Wilson
  • 389
  • 2
  • 6
  • Does this really fix a 'connection reset by peer'? – user207421 Aug 10 '16 at 03:51
  • I think the "connection reset by peer" error message was misleading in terms of problem's cause. I had an identical error, and I think the TLS SSL certs were disabled by default, causing the "connection reset by peer" error to occur downstream. – Clark Wilson Aug 10 '16 at 03:59
  • You had an identical error to what? 'Connection reset by peer', or something else? and where do disabled SSL certificates come into it? – user207421 Aug 10 '16 at 05:31