HttpClient ThreadSafeClientConnManager выдает «Сброс соединения» - PullRequest
1 голос
/ 27 августа 2009

Я определяю 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: сброс соединения". Вывод отладки / трассировки стека может быть здесь (фиктивный сайт)

У меня никогда не было возможности что-либо сделать с объектом-сущностью, поскольку при вызове client # execute выдается ошибка. Что я здесь не так делаю?

1 Ответ

2 голосов
/ 27 августа 2009

Aha! Причина была в определении HTTPS с неправильной фабрикой сокетов. Это должен быть SSLSocketFactory

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