2011-04-13 65 views
11

我在使用HttpClient在Android上恢復SSL會話時遇到了很多困難。在Android中使用HttpClient重複使用SSL會話

我每90秒鐘輪詢一次服務器(它只適用於只有一個功能的工業設備),所以我需要恢復會話,否則數據使用從幾kB到1小時150-200kB的skyrockets,這是不可持續的。服務器在Restlet中嵌入了Jetty,並且在我使用OpenSSL測試時支持恢復SSL會話。

我正在重用我的HttpClient對象,所以不是這樣。 Android有一個特定的SSLCertificateSocketFactory,我也嘗試過,它也似乎沒有工作。

有什麼我完全失蹤了嗎?我曾假設HttpClient會自動執行此操作,但我不確定自己做錯了什麼,互聯網上也沒有人出現類似的問題。

我已經設置了HttpClient的經過:

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; 
    } 
    } 

(我使用目的端口444)

然後就重用我用一個簡單的HTTPGET和基本授權HttpClient的對象。

我在這裏做錯了什麼!任何人,請幫助!

+0

'返回新的DefaultHttpClient(ccm,params);' - 應該是一個'新的DelegateHttpClient'? – sarnold 2011-04-13 02:34:36

+0

啊,我已經搞亂了它很多年,固定OP - 這不是問題,雖然 – user705142 2011-04-13 06:59:45

回答

2

它是固定的。它現在正在使用會話並消耗少量的數據。

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

刪除該行修復它,儘管HttpClient的甚至從來沒有使用HTTP /端口80爲什麼這個作品,我不知道。

+0

鈮:我還需要切換到簡單連接器 - 碼頭似乎沒有與會話工作。 – user705142 2011-07-01 02:58:26