2015-03-30 8 views
12

द्वारा कनेक्शन रीसेट हम बिना किसी हिचकी के लगभग 2 वर्षों तक HTTP यूआरएल के साथ वेब सर्वर से डेटा सफलतापूर्वक प्राप्त कर रहे हैं।I/O त्रुटि, सहकर्मी

हाल के दिनों में हम कुछ सुरक्षा कारणों से HTTPS पर माइग्रेट हो गए हैं। और जब समस्या खराब हो गई।

वाईफाई के साथ सब कुछ ठीक काम करता है, जब मैं समय-समय पर 2 जी जेब डेटा से कनेक्ट करता हूं तो मुझे सर्वर समस्या से कनेक्शन रीसेट मिल रहा है।

मैं सर्वर से कनेक्ट करने के लिए DefaultHttpClient का उपयोग कर रहा हूं।

मैंने कई काम करने की कोशिश की है लेकिन मुझे कुछ भी बचा नहीं है।

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

  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. और एक और गूगल समूह चर्चा करने के लिए सभी उपलब्ध गुण आवेदन किया है सुझाव इस मुद्दे एक गतिविधि की आदर्श राज्य का एक कारण हो सकता है। तो मैंने स्क्रीन को जागने के लिए इस तरह कुछ लागू किया।

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

और onDestroy() पर मैं wakeLock.release();

साथ इसे जारी किया लेकिन वह भी मदद नहीं की।

और क्या मुझे कुछ और है जो मुझे सर्वर के अंत में जांचने की ज़रूरत है?

+2

मैं एक Android एप्लिकेशन विकसित करने के लिए twitter4j एपीआई का उपयोग कर एक ही समस्या का सामना करना पड़ रहा है। वाईफाई का उपयोग करते समय सब ठीक काम करता है लेकिन जब मैं 2 जी पर स्विच करता हूं तो यह समस्या अक्सर होती है। – sahu

+0

आपने इसे कैसे हल किया? मुझे retrofit और okhttp – Rickster

+0

के साथ एक ही समस्या हो रही है यह समस्या एंड्रॉइड एंड से अभी तक हल नहीं हुई है। ! लेकिन वेब सेवा में चारों ओर कुछ काम घटना के अनुपात में कमी आई है। उन्होंने बस डीबी से प्राप्त करने के तरीके को अनुकूलित किया। – MohanRaj

उत्तर

4

मुझे एक समान SSL त्रुटि थी। पूर्व-लॉलीपॉप डिवाइस चालू करता है SSL TLSv1.1, TLSv1.2 का समर्थन नहीं करता है। मैंने इसे एक TLSSocketFactory wrapper क्लास समेत तय किया जो इन 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; 
    } 
} 
+0

क्या यह वास्तव में 'सहकर्मी द्वारा कनेक्शन रीसेट' को ठीक करता है? – EJP

+0

मुझे लगता है कि "सहकर्मी द्वारा कनेक्शन रीसेट" त्रुटि संदेश समस्या के कारण के मामले में भ्रामक था। मेरे पास एक समान त्रुटि थी, और मुझे लगता है कि टीएलएस एसएसएल कर्ट डिफ़ॉल्ट रूप से अक्षम किए गए थे, जिससे "पीयर द्वारा कनेक्शन रीसेट" त्रुटि डाउनस्ट्रीम हो सकती है। –

+0

आपके पास एक समान त्रुटि थी? 'सहकर्मी द्वारा कनेक्शन रीसेट', या कुछ और? और एसएसएल प्रमाणपत्र कहाँ अक्षम हैं? – EJP

संबंधित मुद्दे