我在使用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的對象。
我在這裏做錯了什麼!任何人,請幫助!
'返回新的DefaultHttpClient(ccm,params);' - 應該是一個'新的DelegateHttpClient'? – sarnold 2011-04-13 02:34:36
啊,我已經搞亂了它很多年,固定OP - 這不是問題,雖然 – user705142 2011-04-13 06:59:45