Excepción HTTPS de Android Restablecimiento de la conexión por pares
Estoy trabajando en una aplicación que está descargando datos de un servidor web.Parece descargar datos sin ningún problema al principio, pero hace unos días recibo este tipo de excepciones: javax.net.ssl.SSLException: Read error: ssl=0x7a6588: I/O error during system call, Connection reset by peer
y no estoy seguro de qué causa ese problema y cómo puedo solucionarlo. Aquí está el mensaje completo de LogCat
:
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)
Esto es lo que obtuve en mi método UseHttpsConnection
:
- DownloadManager: entiende la política de reintentos y los códigos de error
- Android WebView.postUrl () que muestra la pantalla en blanco al publicar en la URL HTTPS
- WebView con certificado de cliente SSL en Android 4 ICS
- ¿Cómo obtener InputStream de un https, Push Servlet fragmentado?
- ¿Cómo hacer un HTTPS POST de Android?
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."); } }
Y aquí está mi AsyncTask que estoy usando para conectar y descargar los datos:
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"); } }
Así que cualquier persona tiene una idea de cómo manejar esa excepción para que pueda descargar todos los datos sin excepciones. O cómo puedo arreglar eso si es imposible.
¡Gracias por adelantado!
- Acceso web automático de Webview de Android al sitio Web de https estableciendo cookies de token
- Hacer una conexión HTTPS mediante URL.openConnection ()
- Solicitud HTTP de SSL de Android mediante cert auto-firmado y CA
- Agregar una autoridad de certificado mediante programación al mismo tiempo que mantiene certificados SSL de sistema de Android
- javax.net.ssl.SSLPeerUnverifiedException: Nombre de host no verificado:
- Cómo utilizar un certificado SSL auto-firmado en Android
- Descarga de recursos de imágenes desde https con LoopJ AndroidAsyncHttp
- Android - Solicitud HTTP GET
En realidad, hay dos opciones que puede hacer en esta situación. Puede obtener esa excepción mientras descarga datos a través de Internet y crea una función que iniciará de nuevo la conexión desde donde se detiene. Así que tienes que encontrar una manera de guardar tu progreso mientras descargas los datos, porque si estás descargando un gran tamaño de datos, no es una buena idea iniciar el proceso de nuevo.
Otra cosa que usted puede hacer es crear un diálogo, que informará al usuario que hay error mientras que sincroniza y le dejó elegir si él quiere intentar de nuevo la operación o cancelarlo. Si el usuario selecciona la opción de reintentar pienso que será un Mejor opción para iniciar la conexión de nuevo desde el lugar donde se detiene de nuevo. Así que tienes que salvar tu progreso en ambos sentidos. Creo que es más fácil de usar.
- Obtener facebook deeplinks para trabajar en el emulador facebook android
- ¿Por qué LocationSettingsResult startResolutionForResult no llama a OnActivityResult?