【问题标题】:HttpClient ThreadSafeClientConnManager throws "Connection reset"HttpClient ThreadSafeClientConnManager 抛出“连接重置”
【发布时间】:2009-08-27 17:47:56
【问题描述】:

我以两种不同的方式定义 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”失败。 Debug/stacktrace 输出可以是seen here(虚构网站)

我从来没有机会对实体对象做任何事情,因为在 client#execute 调用时会抛出错误。我在这里做错了什么?

【问题讨论】:

    标签: java httpclient socketexception


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多