ข้อผิดพลาด I/O ระหว่างการเรียกของระบบ การเชื่อมต่อถูกรีเซ็ตโดยเพียร์

เราดึงข้อมูลจากเว็บเซิร์ฟเวอร์ที่มี URL HTTP ได้สำเร็จมาเป็นเวลาเกือบ 2 ปีโดยไม่มีอาการสะดุดใดๆ

ในอดีตที่ผ่านมา เราได้ย้ายไปยัง HTTPS ด้วยเหตุผลด้านความปลอดภัยบางประการ และนั่นคือช่วงเวลาที่ปัญหาบานสะพรั่ง

ด้วย WiFi ทุกอย่างทำงานได้ดี เมื่อฉันเชื่อมต่อกับข้อมูลพกพา 2G เป็นระยะ ฉันจะได้รับการรีเซ็ตการเชื่อมต่อเนื่องจากปัญหาของเซิร์ฟเวอร์

ฉันใช้ DefaultHttpClient เพื่อเชื่อมต่อกับเซิร์ฟเวอร์

ฉันได้ลองทำงานหลายอย่างแล้ว แต่ไม่มีอะไรช่วยฉันได้

  1. javax.net.ssl.SSLException: ข้อผิดพลาดในการอ่าน: ssl=0x56e63588: ข้อผิดพลาด I/O ระหว่างการโทรของระบบ การเชื่อมต่อถูกรีเซ็ตโดยเพียร์

  2. ฉันได้ใช้คุณสมบัติที่มีอยู่ทั้งหมดกับ 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. และการสนทนาอีกกลุ่มของ Google แนะนำว่าปัญหานี้อาจเป็นสาเหตุของสถานะในอุดมคติของกิจกรรม ดังนั้นฉันจึงใช้สิ่งนี้เพื่อทำให้หน้าจอตื่นอยู่เสมอ

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

และที่ onDestroy() ฉันก็ปล่อยมันด้วย wakeLock.release();

แต่นั่นก็ไม่ได้ช่วยเช่นกัน

และมีอะไรอีกบ้างที่ฉันจำเป็นต้องตรวจสอบที่ฝั่งเซิร์ฟเวอร์?


person MohanRaj    schedule 30.03.2015    source แหล่งที่มา
comment
ฉันกำลังประสบปัญหาเดียวกันโดยใช้ twitter4j api เพื่อพัฒนาแอป Android ในขณะที่ใช้ wifi ทุกอย่างทำงานได้ดี แต่เมื่อฉันเปลี่ยนเป็น 2g ปัญหานี้จะเกิดขึ้นบ่อยครั้ง   -  person sahu    schedule 19.04.2015
comment
คุณแก้ปัญหานี้ได้อย่างไร? ฉันได้รับปัญหาที่คล้ายกันกับชุดติดตั้งเพิ่มเติมและ okhttp   -  person Rickster    schedule 28.05.2015
comment
ปัญหานี้ยังไม่ได้รับการแก้ไขจากฝั่ง Android ! แต่การแก้ไขเล็กน้อยในบริการเว็บทำให้อัตราการเกิดขึ้นลดลง พวกเขาเพิ่งปรับวิธีการดึงข้อมูลจากฐานข้อมูลให้เหมาะสม   -  person MohanRaj    schedule 30.05.2015
comment
นี่ยังเป็นคำถามอยู่หรือเปล่า? หรือปัญหานี้ได้รับการจัดการมานานแล้ว?   -  person jfriend00    schedule 22.05.2016
comment
ยังไม่ได้รับการแก้ไข!   -  person MohanRaj    schedule 19.06.2016
comment
ไม่น่าจะไม่มีทางแก้ไขได้เนื่องจาก Android พยายามประหยัดแบตเตอรี่และแบนด์วิธผ่านเซลลูลาร์ จึงปรับเปลี่ยนประเภทสัญญาณที่ส่งผ่าน 2G ไม่ว่ามันจะทำอะไรก็ตาม KEEP ALIVE อาจถูกละเมิดจากระยะไกล และคิดว่าอุปกรณ์เซลลูลาร์ถูกตัดการเชื่อมต่ออย่างเงียบๆ   -  person Johnny V    schedule 07.08.2016


คำตอบ (1)


ฉันมีข้อผิดพลาด SSL ที่คล้ายกัน ปรากฎว่าอุปกรณ์พรีอมยิ้มไม่รองรับ SSL TLSv1.1, TLSv1.2 ฉันแก้ไขมันโดยรวมคลาส wrapper TLSSocketFactory ที่เปิดใช้งานโปรโตคอล SSL เหล่านี้ ลองเพิ่มสิ่งต่อไปนี้ในรหัสของคุณ:

    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
สิ่งนี้สามารถแก้ไข 'การรีเซ็ตการเชื่อมต่อโดยเพียร์' ได้จริงหรือ - person user207421; 10.08.2016
comment
ฉันคิดว่าการเชื่อมต่อที่ถูกรีเซ็ตโดยข้อความแสดงข้อผิดพลาดเพียร์ทำให้เข้าใจผิดในแง่ของสาเหตุของปัญหา ฉันมีข้อผิดพลาดเหมือนกัน และฉันคิดว่าใบรับรอง TLS SSL ถูกปิดใช้งานตามค่าเริ่มต้น ทำให้การเชื่อมต่อถูกรีเซ็ตโดยข้อผิดพลาดเพียร์เกิดขึ้นที่ดาวน์สตรีม - person Clark Wilson; 10.08.2016
comment
คุณมีข้อผิดพลาดเหมือนกันกับอะไร? 'การเชื่อมต่อถูกรีเซ็ตโดยเพียร์' หรืออย่างอื่น และใบรับรอง SSL ที่ปิดใช้งานเข้ามาอยู่ที่ไหน - person user207421; 10.08.2016