2011-04-13 10 views
11

Tengo muchas dificultades para reanudar una sesión SSL en Android usando HttpClient.Reutilización de sesiones SSL en Android con HttpClient

Estoy sondeando un servidor cada 90 segundos (es para dispositivos industriales con una sola función), así que necesito reanudar la sesión o si el uso de datos se dispara de unos pocos kB por hora hasta 150-200kB, que es insostenible El servidor está incrustado Jetty en Restlet, y admite la reanudación de las sesiones SSL cuando lo pruebo usando OpenSSL hasta donde yo sé.

Estoy reutilizando mi objeto HttpClient, así que no es eso. Android tiene un SSLCertificateSocketFactory específico que también he probado y tampoco parece funcionar.

¿Hay algo que me falta por completo aquí? Supuse que HttpClient haría esto automáticamente, no estoy seguro de lo que estoy haciendo mal, y nadie en Internet parece enfrentarse a un problema similar.

He configurado el HttpClient a través de:

public HttpClient getNewHttpClient(Context context) { 
    try { 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 
     HttpConnectionParams.setStaleCheckingEnabled(params, false); 

     HttpConnectionParams.setConnectionTimeout(params, 4 * 1000); 
     HttpConnectionParams.setSoTimeout(params, 5 * 1000); 
     HttpConnectionParams.setSocketBufferSize(params, 8192); 

     HttpClientParams.setRedirecting(params, false); 

     SSLSessionCache sslSession = new SSLSessionCache(context); 
     SchemeRegistry registry = new SchemeRegistry(); 

     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     registry.register(new Scheme("https", SSLCertificateSocketFactory.getHttpSocketFactory(10*60*1000, sslSession), 444)); 
     //registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 444)); 

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

     return new DelegateHttpClient(ccm, params); 

    } catch (Exception e) { 
     return new DefaultHttpClient(); 
    } 
} 

private static class DelegateHttpClient extends DefaultHttpClient { 

    private DelegateHttpClient(ClientConnectionManager ccm, HttpParams params) { 
     super(ccm, params); 
    } 

    @Override 
    protected HttpContext createHttpContext() { 

     HttpContext context = new BasicHttpContext(); 
     context.setAttribute(ClientContext.AUTHSCHEME_REGISTRY, getAuthSchemes()); 
     context.setAttribute(ClientContext.COOKIESPEC_REGISTRY, getCookieSpecs()); 
     context.setAttribute(ClientContext.CREDS_PROVIDER, getCredentialsProvider()); 

     CookieStore cookieStore = new BasicCookieStore(); // Create a local instance of cookie store 
     context.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

     return context; 
    } 
    } 

(estoy usando el puerto 444 a propósito)

A continuación, sólo volver a usar el objeto HttpClient usando un simple autorización HttpGet y básico.

¿Qué estoy haciendo mal aquí? Cualquiera, por favor ayuda!

+0

'return new DefaultHttpClient (ccm, params);' - ¿Debería ser un 'nuevo DelegateHttpClient'? – sarnold

+0

Ah, sí, he estado metiéndome con eso durante años, arreglé el OP, aunque ese no es el problema – user705142

Respuesta

2

Se ha solucionado. Ahora usa sesiones y consume cantidades de datos diminutas.

registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 

Extracción de esa línea fija que, a pesar de HttpClient ni siquiera utilizando HTTP/puerto 80. ¿Por qué esto funciona no tengo ni idea.

+0

Nb: también necesitaba cambiar al conector simple - Jetty no parece funcionar con sesiones. – user705142

Cuestiones relacionadas