2009-08-27 3 views
1

두 가지 방법으로 HttpClient를 정의합니다. 1. 일반 바닐라 : client = new DefaultHttpClient(); 2. 스레드 안전은 : HttpClient ThreadSafeClientConnManager가 "연결 재설정"을 throw합니다.

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 : 연결 재설정"실패합니다. 디버그/스택 추적 출력은 seen here (가상 사이트)

클라이언트 # execute 호출시 오류가 발생하므로 엔티티 객체를 사용하여 아무 것도 할 수 없습니다. 내가 여기서 뭐하는거야?

답변

2

아하! 이유는 잘못된 소켓 팩토리로 HTTPS를 정의하기 때문입니다. SSLSocketFactory 여야합니다.

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