2011-12-12 14 views
5

द्वारा रीसेट रीसेट मैं एक ऐसे सर्वर पर काम कर रहा हूं जो वेब सर्वर से डेटा डाउनलोड कर रहा है। ऐसा लगता है कि शुरुआत में किसी भी समस्या के बिना डेटा डाउनलोड करना प्रतीत होता है, लेकिन कुछ दिन पहले मैं इस तरह के अपवाद प्राप्त करना शुरू करता हूं : javax.net.ssl.SSLException: Read error: ssl=0x7a6588: I/O error during system call, Connection reset by peer और मुझे यकीन नहीं है कि उस समस्या का कारण क्या है और मैं इसे कैसे ठीक कर सकता हूं।एंड्रॉइड एचटीटीपीएस अपवाद सहकर्मी

:

public void UseHttpsConnection(String url, String charset, String query) { 

    try { 
     final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
      @Override 
      public void checkClientTrusted(final X509Certificate[] chain, final String authType) { 
      } 
      @Override 
      public void checkServerTrusted(final X509Certificate[] chain, final String authType) { 
      } 
      @Override 
      public X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 
     } }; 

     // Install the all-trusting trust manager 
     final SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); 
     // Create an ssl socket factory with our all-trusting manager 
     final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 

     if (url.startsWith("https://")) { 
      HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){ 
       public boolean verify(String hostname, SSLSession session) { 
        return true; 
       }}); 
     } 

     System.setProperty("http.keepAlive", "false"); 
     HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection(); 
     connection.setSSLSocketFactory(sslSocketFactory); 
     connection.setDoOutput(true); 
     connection.setConnectTimeout(15000 /* milliseconds */); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Charset", charset); 
     connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=" + charset); 
     OutputStream output = null; 
     try { 
      output = connection.getOutputStream(); 
      output.write(query.getBytes(charset)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      showError2("Check your network settings!"); 

     } finally { 
      if (output != null) 
       try { 
        output.close(); 
       } catch (IOException logOrIgnore) { 
        logOrIgnore.printStackTrace(); 
       } 
     } 

     int status = ((HttpsURLConnection) connection).getResponseCode(); 
     Log.d("", "Status : " + status); 

     for (Entry<String, List<String>> header : connection 
       .getHeaderFields().entrySet()) { 
      Log.d("Headers","Headers : " + header.getKey() + "="+ header.getValue()); 
     } 

     InputStream response = new BufferedInputStream(connection.getInputStream()); 

     int bytesRead = -1; 
     byte[] buffer = new byte[30 * 1024]; 
     while ((bytesRead = response.read(buffer)) > 0) { 
      byte[] buffer2 = new byte[bytesRead]; 
      System.arraycopy(buffer, 0, buffer2, 0, bytesRead); 
      handleDataFromSync(buffer2); 
     } 
     connection.disconnect(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     showError2("Synchronization failed!Please try again."); 

    } catch (KeyManagementException e) { 
     e.printStackTrace(); 
     showError2("Error occured.Please try again."); 

    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
     showError2("Error occured.Please try again."); 
    } 
} 

और यहाँ मेरी AsyncTask जो मैं कनेक्ट और डेटा डाउनलोड करने के लिए उपयोग कर रहा हूँ है:

12-12 11:43:27.950: W/System.err(22010): javax.net.ssl.SSLException: Read error: ssl=0x7a6588: I/O error during system call, Connection reset by peer 
12-12 11:43:27.960: W/System.err(22010): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_read(Native Method) 
12-12 11:43:27.960: W/System.err(22010): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:788) 
12-12 11:43:27.960: W/System.err(22010): at org.apache.harmony.luni.internal.net.www.protocol.http.ChunkedInputStream.read(ChunkedInputStream.java:50) 
12-12 11:43:27.960: W/System.err(22010): at java.io.InputStream.read(InputStream.java:157) 
12-12 11:43:27.960: W/System.err(22010): at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:225) 
12-12 11:43:27.960: W/System.err(22010): at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:178) 
12-12 11:43:27.960: W/System.err(22010): at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:174) 
12-12 11:43:27.960: W/System.err(22010): at java.io.BufferedInputStream.read(BufferedInputStream.java:319) 
12-12 11:43:27.970: W/System.err(22010): at java.io.FilterInputStream.read(FilterInputStream.java:133) 
12-12 11:43:27.970: W/System.err(22010): at com.stampii.stampii.synchronization.Synchronization.UseHttpsConnection(Synchronization.java:1367) 
12-12 11:43:27.970: W/System.err(22010): at com.stampii.stampii.synchronization.Synchronization$ActivateCollection.doInBackground(Synchronization.java:613) 
12-12 11:43:27.970: W/System.err(22010): at com.stampii.stampii.synchronization.Synchronization$ActivateCollection.doInBackground(Synchronization.java:1) 
12-12 11:43:27.970: W/System.err(22010): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
12-12 11:43:27.970: W/System.err(22010): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
12-12 11:43:27.970: W/System.err(22010): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
12-12 11:43:27.970: W/System.err(22010): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
12-12 11:43:27.970: W/System.err(22010): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
12-12 11:43:27.970: W/System.err(22010): at java.lang.Thread.run(Thread.java:1027) 

यह वही है मैं अपने UseHttpsConnection पद्धति पर मिल गया है: यहाँ पूरे LogCat संदेश है

public class DeactivateCollection extends AsyncTask <Context, Integer, Void> { 
    @Override 
    protected Void doInBackground(Context... arrContext) { 
     try { 
      String charset = "UTF-8"; 
      hash = getAuthHash(); 
      SharedPreferences lastUser = PreferenceManager 
        .getDefaultSharedPreferences(Synchronization.this); 
      int userId = lastUser.getInt("lastUser", 1); 

      systemDbHelper = new SystemDatabaseHelper(Synchronization.this, null, 1); 
      systemDbHelper.initialize(Synchronization.this); 
      String sql = "SELECT dbTimestamp FROM users WHERE objectId=" + userId; 
      Cursor cursor = systemDbHelper.executeSQLQuery(sql); 
      if (cursor.getCount() < 0) { 
       cursor.close(); 
      } else if (cursor.getCount() > 0) { 
       cursor.moveToFirst(); 
       timeStamp = cursor.getString(cursor.getColumnIndex("dbTimestamp")); 
       Log.d("", "timeStamp : " + timeStamp); 
      } 

      String query = String.format("debug_data=%s&" 
        + "client_auth_hash=%s&" + "timestamp=%s&" 
        + "deactivate_collections=%s&" + "client_api_ver=%s&" 
        + "set_locale=%s&" + "device_os_type=%s&" 
        + "device_sync_type=%s&" 
        + "device_identification_string=%s&" 
        + "device_identificator=%s&" + "device_resolution=%s", 
        URLEncoder.encode("1", charset), 
        URLEncoder.encode(hash, charset), 
        URLEncoder.encode(timeStamp, charset), 
        URLEncoder.encode(Integer.toString(deac), charset), 
        URLEncoder.encode(clientApiVersion, charset), 
        URLEncoder.encode(locale, charset), 
        URLEncoder.encode(version, charset), 
        URLEncoder.encode("14", charset), 
        URLEncoder.encode(version, charset), 
        URLEncoder.encode(deviceId, charset), 
        URLEncoder.encode(resolution, charset)); 

      Log.e("","hash : "+hash); 
      Log.e("","deactivate : "+Integer.toString(deac)); 

      SharedPreferences useSSLConnection = PreferenceManager.getDefaultSharedPreferences(Synchronization.this); 
      boolean useSSl = useSSLConnection.getBoolean("UseSSl", true); 
      if (useSSl) { 
       UseHttpsConnection(url, charset, query); 
      } else { 
       UseHttpConnection(url, charset, query); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     Log.d("","ON PROGRESS UPDATE"); 

    } 
    @Override 
    protected void onCancelled() { 
     Log.d("","ON CANCELLED"); 

    } 
    @Override 
    protected void onPreExecute() 
    { 
     Log.d("","ON PRE EXECUTE"); 
    } 
    @Override 
    protected void onPostExecute(Void v) { 
     Log.d("","ON POST EXECUTE"); 

    } 
    } 

इसलिए किसी को भी यह पता है कि उस अपवाद को कैसे संभालना है ताकि मैं बिना किसी अपवाद के पूरे डेटा को डाउनलोड कर सकूं। या अगर यह असंभव है तो मैं इसे कैसे ठीक कर सकता हूं।

अग्रिम धन्यवाद!

उत्तर

6

वास्तव में इस स्थिति में आप दो विकल्प कर सकते हैं। आप इंटरनेट पर डेटा डाउनलोड करते समय उस अपवाद को पकड़ सकते हैं और एक फ़ंक्शन बना सकते हैं जो कनेक्शन को फिर से शुरू कर देगा। तो आपको डेटा डाउनलोड करते समय अपनी प्रगति को बचाने के लिए एक रास्ता खोजना होगा, क्योंकि यदि आप डेटा का बड़ा आकार डाउनलोड कर रहे हैं तो प्रक्रिया को फिर से शुरू करना अच्छा नहीं है।

एक और चीज जो आप कर सकते हैं वह एक संवाद बनाने के लिए है, जो उपयोगकर्ता को सूचित करेगा कि सिंक्रनाइज़ करते समय त्रुटि है और उसे चुनने दें कि क्या वह ऑपरेशन को फिर से प्रयास करना है या इसे रद्द करना है। यदि उपयोगकर्ता पुनः प्रयास विकल्प चुनता है तो मुझे लगता है कनेक्शन फिर से शुरू करने के लिए यह एक बेहतर विकल्प होगा जहां से यह फिर से बंद हो जाता है। तो आपको अपनी प्रगति को दोनों तरीकों से सहेजना होगा। मुझे लगता है कि यह अधिक उपयोगकर्ता के अनुकूल है।

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