HttpClient ThreadSafeClientConnManager抛出“连接重置”

我以两种不同的方式定义HttpClient:1。Plain vanilla:client = new DefaultHttpClient(); 2.线程安全:

DefaultHttpClient getThreadSafeHttpClient() { HttpParams params = new BasicHttpParams(); params .setParameter( "http.useragent", "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"); 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)); registry.register(new Scheme("https", PlainSocketFactory.getSocketFactory(), 443)); final ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry); return new DefaultHttpClient(manager, params); } 

然后我为两种客户端类型(简单的GET请求)运行相同的JUnit测试。 #1总是正常运行,#2总是因“java.net.SocketException:Connection reset”而失败。 这里可以看到调试/堆栈跟踪输出(虚构站点)

我永远不会有机会对实体对象做任何事情,因为在客户端#execute调用时会抛出错误。 我在这里做错了什么?

啊哈! 原因是用错误的套接字工厂定义HTTPS。 它应该是SSLSocketFactory

 SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); sslSocketFactory.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); registry.register(new Scheme("https", sslSocketFactory, 443));