使用HttpClient在Android上恢复SSL会话时遇到了很多困难。
我每90秒轮询一次服务器(仅适用于只有一个功能的工业设备),所以我需要恢复会话,否则数据会使用从每小时几KB到最高150-200kB的数据,这是不可持续的。服务器是在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和Basic授权重用HttpClient对象。
我在这里做错了什么!任何人,请帮忙!
答案 0 :(得分:2)
这是固定的。它现在正在使用会话并消耗少量数据。
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
除非HttpClient从未使用http /端口80,否则删除该行会修复它。为什么这样做有效我不知道。