2015-03-30 18 views
12

Chúng tôi đã tìm nạp thành công dữ liệu từ máy chủ web có url HTTP trong gần 2 năm mà không bị trục trặc.Lỗi I/O trong khi gọi hệ thống, Thiết lập lại kết nối theo ngang hàng

Trong quá khứ gần đây, chúng tôi đã di chuyển sang HTTPS vì một số lý do bảo mật. Và đó là khi vấn đề nảy sinh.

Với WiFi mọi thứ hoạt động tốt, Khi tôi kết nối với dữ liệu bỏ túi 2G theo định kỳ, tôi nhận được kết nối được đặt lại do sự cố máy chủ.

Tôi đang sử dụng DefaultHttpClient để kết nối với máy chủ.

Tôi đã thử nhiều công việc xung quanh nhưng không có gì cứu tôi.

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

  2. tôi đã áp dụng tất cả các thuộc tính có sẵn để 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. Và một thảo luận nhóm google gợi ý rằng vấn đề này có thể là một nguyên nhân gây ra tình trạng lý tưởng của một hoạt động. Vì vậy, tôi đã thực hiện một cái gì đó như thế này để giữ cho màn hình tỉnh táo.

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

Và tại onDestroy() tôi phát hành nó với wakeLock.release();

Nhưng điều đó quá không giúp đỡ.

Và có bất kỳ điều gì khác mà tôi cần phải kiểm tra ở cuối máy chủ không?

+2

Tôi đang phải đối mặt với cùng một vấn đề sử dụng twitter4j api cho việc phát triển một ứng dụng Android. Trong khi sử dụng wifi tất cả mọi thứ hoạt động tốt nhưng khi tôi chuyển sang 2g thì vấn đề này xảy ra thường xuyên. – sahu

+0

Bạn đã giải quyết vấn đề này bằng cách nào? Tôi gặp vấn đề tương tự với trang bị thêm và okhttp – Rickster

+0

Vấn đề này chưa được giải quyết từ đầu Android. ! Nhưng ít công việc xung quanh trong dịch vụ web giảm tỷ lệ xảy ra. Họ chỉ tối ưu hóa cách họ lấy từ DB. – MohanRaj

Trả lời

4

Tôi đã gặp lỗi SSL tương tự. Hóa ra các thiết bị Pre-lollipop không hỗ trợ SSL TLSv1.1, TLSv1.2. Tôi đã sửa nó bằng cách bao gồm một lớp trình bao bọc TLSSocketFactory cho phép các giao thức SSL này. Hãy thử thêm dòng sau vào code của bạn:

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

Điều này thực sự sửa chữa một 'kết nối thiết lập lại bởi peer'? – EJP

+0

Tôi nghĩ rằng thông báo lỗi "kết nối lại bằng peer" đã gây hiểu nhầm về nguyên nhân của sự cố. Tôi đã có một lỗi giống hệt nhau và tôi nghĩ rằng các chứng chỉ SSL TLS đã bị vô hiệu hóa theo mặc định, khiến lỗi "kết nối được đặt lại bởi peer" xảy ra ở hạ lưu. –

+0

Bạn có lỗi giống hệt với cái gì? 'Kết nối được thiết lập lại bởi peer', hoặc cái gì khác? và các chứng chỉ SSL bị vô hiệu hóa xuất hiện ở đâu? – EJP

Các vấn đề liên quan