httpclient threadsafeclientconnmanager는“Connection Reset”을 던지기
-
20-09-2019 - |
문제
나는 두 가지 다른 방식으로 httpclient를 정의합니다. 1. 일반 바닐라 : 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);
}
그런 다음 두 클라이언트 유형에 대해 동일한 Junit 테스트를 실행합니다 (간단한 GET 요청). #1은 항상 잘 실행되며 #2는 항상 "java.net.socketexception : Connection Reset"으로 실패합니다. 디버그/스택 트레이스 출력이 될 수 있습니다 여기서 보았습니다 (가상 사이트)
클라이언트#Execute Call에서 오류가 발생하기 때문에 엔티티 객체로 아무것도 할 수있는 기회를 얻지 못합니다. 내가 여기서 뭐가 잘못하고 있는가?
해결책
아하! 그 이유는 소켓 공장이 잘못된 HTTP를 정의하기 때문입니다. sslsocketfactory 여야합니다
SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
sslSocketFactory.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
registry.register(new Scheme("https", sslSocketFactory, 443));
제휴하지 않습니다 StackOverflow