Kesalahan I/O selama panggilan sistem, Koneksi direset oleh rekan

Kami telah berhasil mengambil data dari server web dengan url HTTP selama hampir 2 tahun tanpa gangguan apa pun.

Baru-baru ini kami telah bermigrasi ke HTTPS karena beberapa alasan keamanan. Dan saat itulah masalah muncul.

Dengan WiFi semuanya berfungsi dengan baik, Saat saya terhubung ke data saku 2G secara berkala, koneksi saya disetel ulang karena masalah server.

Saya menggunakan DefaultHttpClient untuk terhubung ke server.

Saya telah mencoba banyak solusi tetapi tidak ada yang menyelamatkan saya.

  1. javax.net.ssl.SSLException: Kesalahan baca: ssl=0x56e63588: Kesalahan I/O selama panggilan sistem, Koneksi disetel ulang oleh rekan

  2. Saya telah menerapkan semua properti yang tersedia ke 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. Dan diskusi grup Google lainnya menyarankan bahwa masalah ini bisa menjadi penyebab keadaan ideal suatu aktivitas. Jadi saya menerapkan sesuatu seperti ini agar layar tetap aktif.

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

Dan di onDestroy() saya melepaskannya dengan wakeLock.release();

Tapi itu juga tidak membantu.

Dan apakah ada hal lain yang perlu saya periksa di server akhir?


person MohanRaj    schedule 30.03.2015    source sumber
comment
Saya menghadapi masalah yang sama saat menggunakan api twitter4j untuk mengembangkan aplikasi Android. Saat menggunakan wifi semuanya berfungsi dengan baik tetapi ketika saya beralih ke 2g maka masalah ini sering terjadi.   -  person sahu    schedule 19.04.2015
comment
Bagaimana Anda mengatasi ini? Saya mendapatkan masalah serupa dengan retrofit dan okhttp   -  person Rickster    schedule 28.05.2015
comment
Masalah ini belum terselesaikan dari Android end. ! Namun hanya sedikit solusi dalam layanan web yang menurunkan rasio kejadian. Mereka baru saja mengoptimalkan cara mengambil dari DB.   -  person MohanRaj    schedule 30.05.2015
comment
Apakah ini masih menjadi pertanyaan aktif? Atau apakah masalah ini sudah lama ditangani?   -  person jfriend00    schedule 22.05.2016
comment
Itu masih belum terselesaikan!   -  person MohanRaj    schedule 19.06.2016
comment
Mungkin tidak akan pernah ada solusi untuk masalah ini karena Android sedang mencoba menghemat baterai dan bandwidth melalui seluler; sehingga menyesuaikan jenis sinyal yang dikirimkan melalui 2G. Apa pun yang dilakukannya, KEEP ALIVE mungkin sedang dilanggar di sisi jarak jauh dan menganggap perangkat seluler terputus secara diam-diam.   -  person Johnny V    schedule 07.08.2016


Jawaban (1)


Saya mengalami kesalahan SSL serupa. Ternyata perangkat Pra-lollipop tidak mendukung SSL TLSv1.1, TLSv1.2. Saya memperbaikinya dengan menyertakan kelas pembungkus TLSSocketFactory yang mengaktifkan protokol SSL ini. Coba tambahkan yang berikut ke kode Anda:

    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;
    }
}
person Clark Wilson    schedule 10.08.2016
comment
Apakah ini benar-benar memperbaiki 'koneksi disetel ulang oleh rekan'? - person user207421; 10.08.2016
comment
Saya pikir pesan kesalahan koneksi disetel ulang oleh rekan menyesatkan dalam hal penyebab masalah. Saya mengalami kesalahan yang sama, dan menurut saya sertifikat TLS SSL dinonaktifkan secara default, menyebabkan kesalahan koneksi disetel ulang oleh rekan terjadi di hilir. - person Clark Wilson; 10.08.2016
comment
Anda mengalami kesalahan serupa dengan apa? 'Koneksi disetel ulang oleh rekan', atau yang lainnya? dan dari mana datangnya sertifikat SSL yang dinonaktifkan? - person user207421; 10.08.2016