使用HttpClient 4.5通过Java代理下载HTTPS页面

时间:2016-08-07 14:12:34

标签: java ssl https proxy httpclient

我尝试通过代理下载Apache HttpClient 4.5的https页面。

某些下载成功完成,但与其他人一起收到错误。

为什么呢?我有什么问题吗?

    // OriginalImage is RGBColor, CurrentImage is GrayScale, you could change this with minor adjusts.

    Mat dest = OriginalImage.clone();
    byte[] b = new byte[4];
    for (int j= 0; j<OriginalImage.cols(); ++j)
    {
        for (int i=0; i<OriginalImage.rows(); ++i)
        {
            b[0] = (byte)Math.abs(OriginalImage.get(i,j)[0] - CurrentImage.get(i,j)[0]);
            //b[1] = valor;
            //b[2] = valor;
            //b[3] = (byte)(255 & 0xFF);
            dest.put(i,j, b);
        }
    }
    CurrentImage = dest;

这是程序生成的输出:

package hu.istvanbohm.mypublist.test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.TimeUnit;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

public class TestHttpClientDownloader {

    public static void main(String[] args) throws URISyntaxException {
        String rawUrl = "https://*********.com";
        String[] proxies = {"1.161.158.86:8080","1.179.183.27:3128","1.179.201.18:3128","1.207.245.184:80",
                "1.207.62.194:3128","1.234.28.160:80","1.234.28.18:80",
                "1.234.28.20:80","1.234.28.36:80","1.234.28.42:80"};

        URI targetUri = new URI(rawUrl);

        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(100);

        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .setRetryHandler(new StandardHttpRequestRetryHandler(0,false))
                .setConnectionTimeToLive(25, TimeUnit.SECONDS )
                .build();

        for(String proxyString : proxies) {
            String[] proxyParts = proxyString.split(":");
            String proxyUrl = proxyParts[0];
            int proxyPort = Integer.parseInt(proxyParts[1]);

            HttpGet request = new HttpGet(targetUri);
            RequestConfig config = RequestConfig.custom()
                    .setProxy(new HttpHost(proxyUrl,proxyPort))
                    .setCookieSpec(CookieSpecs.STANDARD)
                    .setSocketTimeout(25000)
                    .setConnectTimeout(25000)
                    .setConnectionRequestTimeout(25000)
                    .build();
            request.setConfig(config);
            HttpClientContext context = HttpClientContext.create();
            context.setAttribute("http.protocol.handle-redirects", false);  
            HttpEntity entity = null;
            try {
                System.out.println("Submit: Executing request " + request.getRequestLine() + 
                        " to " + request.getURI()  + " via " + request.getConfig().getProxy());
                CloseableHttpResponse response = httpClient.execute(request,context);
                try {
                    entity = response.getEntity(); 
                    StatusLine statusLine = response.getStatusLine();
                    if(entity!=null && statusLine.getStatusCode()==HttpStatus.SC_OK) {
                        String result=EntityUtils.toString(entity,org.apache.http.entity.ContentType.getOrDefault(entity).getCharset());
                        if(result!=null && result.length()>0) System.out.println("Download OK!");
                    } else if(entity!=null){
                        System.out.println("Error - Http status is not OK: " + statusLine.getReasonPhrase());
                    }
                } catch(Exception ex) {
                    System.out.println("Error - HttpClient response: " + ex.getMessage());
                } finally {
                    if(entity!=null) {
                        EntityUtils.consume(entity);
                    }
                    if(response!=null) {
                        response.close();
                    }
                }
            } catch(Exception ex) {
                System.out.println("Error - HttpClient execute: " + ex.getMessage());
            }    
        }

        try {
            httpClient.close();
        } catch (IOException ex) {
            System.out.println("Error - HttpClient close: " + ex.getMessage());
        }
        cm.close();
    }
}

带有扩展错误信息和示例网址的示例输出:

Submit: Executing request GET https://**********.com HTTP/1.1 to https://**********.com via http://1.161.158.86:8080
Error - HttpClient execute: Remote host closed connection during handshake
Submit: Executing request GET https://**********.com HTTP/1.1 to https://**********.com via http://1.179.183.27:3128
Download OK!
Submit: Executing request GET https://**********.com HTTP/1.1 to https://**********.com via http://1.179.201.18:3128
Download OK!
Submit: Executing request GET https://**********.com HTTP/1.1 to https://**********.com via http://1.207.245.184:80
Error - HttpClient execute: Connection reset
Submit: Executing request GET https://**********.com HTTP/1.1 to https://**********.com via http://1.207.62.194:3128
Error - HttpClient execute: Connection reset
Submit: Executing request GET https://**********.com HTTP/1.1 to https://**********.com via http://1.234.28.160:80
Error - HttpClient execute: Unrecognized SSL message, plaintext connection?
Submit: Executing request GET https://**********.com HTTP/1.1 to https://**********.com via http://1.234.28.18:80
Error - HttpClient execute: Unrecognized SSL message, plaintext connection?
Submit: Executing request GET https://**********.com HTTP/1.1 to https://**********.com via http://1.234.28.20:80
Error - HttpClient execute: Unrecognized SSL message, plaintext connection?
Submit: Executing request GET https://**********.com HTTP/1.1 to https://**********.com via http://1.234.28.36:80
Error - HttpClient execute: Unrecognized SSL message, plaintext connection?
Submit: Executing request GET https://**********.com HTTP/1.1 to https://**********.com via http://1.234.28.42:80
Error - HttpClient execute: Unrecognized SSL message, plaintext connection?

0 个答案:

没有答案