2010-01-31 22 views
6

Espero que alguien pueda ayudarme con conexiones intermitentes Estoy obteniendo el código con HttpsURLConnection. El código que estoy usando es a continuación:HttpsURLConnection y conexiones intermitentes

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
      conn.setReadTimeout(10 * 1000); 
if conn.getResponseCode() != 200) { 
      Log.v(TAG, "error code:" + conn.getResponseCode()); 
} 

La conexión funciona cada vez que el primer momento en que lo uso para tirar de un archivo JSON. Sin embargo, cuando uso la conexión nuevamente para enviar un comando, siempre falla la primera vez. Entonces normalmente funciona si envío el comando rápidamente (en 5 segundos), pero falla si espero un poco. No creo que sea un problema de SSL porque conecta la primera vez correctamente, pero podría estar equivocado aquí. También he intentado muchas variaciones diferentes tales como la adición:

conn.setUseCaches(false); 
conn.setRequestProperty("Connection","Keep-Alive"); 
conn.getHostnameVerifier(); 
conn.getSSLSocketFactory(); 
conn.setDoOutput(true); 
conn.setDoInput(true); 
conn.setRequestMethod("POST"); 
conn.wait(100); 

Sin embargo, no tuve suerte. Cualquier ayuda sería muy apreciada.

+0

Si Podría sugerir el uso de 'LogCat' y poner declaraciones de depuración dentro de tu bloque de código para que pueda informarte exactamente qué falla y dónde e –

+0

La respuesta de Logcat que obtengo de conn.getResponseCode() es "-1" He buscado y no he podido encontrar nada en un -1 código de respuesta para las conexiones https. – OliverPank

Respuesta

9

Trate System.setProperty("http.keepAlive", "false"); antes de hacer

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
+0

Perfecto. Esto funcionó. No sabía que podrías usar "Sistema". Supongo que la conexión SSL se mantuvo abierta antes de que pasara por diferentes actividades. ¡Gracias! – OliverPank

+0

Sí, creo que tiene algo que ver con que el error no se lea completamente. – m6tt

+0

http://code.google.com/p/android/issues/detail?id=2939 Debe corregirse a partir de Froyo. –

1

Prueba este código - que funciona bastante fiable para mí:

public static final String USER_AGENT = "Mozilla/5.0 (Linux; U; Android 1.1; en-us;dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2"; 
private DefaultHttpClient getThreadSafeHttpClient() { 
    final HttpParams params = new BasicHttpParams(); 
    params.setParameter("http.useragent", USER_AGENT); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpProtocolParams.setContentCharset(params, "UTF-8"); 
    final SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); 
    sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
    registry.register(new Scheme("https", sslSocketFactory, 443)); 
    final ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry); 
    final DefaultHttpClient httpclient = new DefaultHttpClient(manager, params); 
    // how to handle retries 
    final HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() { 
     public boolean retryRequest(final IOException exception, final int executionCount, final HttpContext context) { 
      if (executionCount >= 5) { 
       // Do not retry if over max retry count 
       return false; 
      } 
      if (exception instanceof NoHttpResponseException) { 
       // Retry if the server dropped connection on us 
       return true; 
      } 
      if (exception instanceof SSLHandshakeException) { 
       // Do not retry on SSL handshake exception 
       return false; 
      } 
      final HttpRequest request = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST); 
      final boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); 
      if (idempotent) { 
       // Retry if the request is considered idempotent 
       return true; 
      } 
      return false; 
     } 

    }; 
    httpclient.setHttpRequestRetryHandler(myRetryHandler); 
    return httpclient; 
} 
+0

Gracias ... eso es mucho más complicado que mi simple https url connect. No estoy seguro de cómo usarlo exactamente. ¿Dónde debería ingresar mi URL ya que la función getThreadSafeHttpClient no tiene ninguna entrada? – OliverPank

+0

solo lo usa para obtener HttpClient y luego usa el cliente como de costumbre. Algo así como 'HttpClient client = getThreadSafeHttpClient();' – Bostone

+0

HttpGet get = new HttpGet (url); HttpResponse response = this.client.execute (get); – Bostone

0

Sólo una pequeña adición a la respuesta de m6tt arriba:

private static void disableConnectionReuseIfNecessary() { 
    // HTTP connection reuse which was buggy pre-froyo 
    if (!Constants.SUPPORTS_FROYO) { 
     System.setProperty("http.keepAlive", "false"); 
    } 
} 
Cuestiones relacionadas