2009-08-27 37 views
1

我以兩種不同的方式定義HttpClient: 1. Plain vanilla:client = new DefaultHttpClient(); 2.線程安全:HttpClient ThreadSafeClientConnManager引發「連接重置」

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(虛構站點)

我從來沒有機會做任何事情與實體對象,因爲在客戶端#執行調用引發錯誤。我在這裏做錯了什麼?

回答

2

啊哈!原因在於定義了HTTPS與錯誤的套接字工廠。它應該是SSLSocketFactory

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