集册 Java实例教程 通过SOCKS代理apache http客户端发送请求

通过SOCKS代理apache http客户端发送请求

欢马劈雪     最近更新时间:2020-01-02 10:19:05

517
通过SOCKS代理Apache HTTP客户端发送请求

/*

 * --------------------------------------------------------------------

 * Licensed to the Apache Software Foundation (ASF) under one

 * or more contributor license agreements.  See the NOTICE file

 * distributed with this work for additional information

 * regarding copyright ownership.  The ASF licenses this file

 * to you under the Apache License, Version 2.0 (the

 * "License"); you may not use this file except in compliance

 * with the License.  You may obtain a copy of the License at

 *

 *   http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing,

 * software distributed under the License is distributed on an

 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

 * KIND, either express or implied.  See the License for the

 * specific language governing permissions and limitations

 * under the License.

 * --------------------------------------------------------------------

 *

 * This software consists of voluntary contributions made by many

 * individuals on behalf of the Apache Software Foundation.  For more

 * information on the Apache Software Foundation, please see

 * <http://www.apache.org/>.

 *

 */
// 来 自 时 代 J     a    v  a - nowjava.com

package org.apache.http.examples.client;


import java.io.IOException;

import java.net.InetSocketAddress;

import java.net.Proxy;

import java.net.Socket;

import java.net.SocketTimeoutException;


import org.apache.http.HttpHost;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.protocol.HttpClientContext;
/**
时 代 J a v a 公 众 号 - N o w J a v  a . c o m
**/

import org.apache.http.config.Registry;

import org.apache.http.config.RegistryBuilder;

import org.apache.http.conn.ConnectTimeoutException;

import org.apache.http.conn.socket.ConnectionSocketFactory;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

import org.apache.http.protocol.HttpContext;

import org.apache.http.util.EntityUtils;


/**

 * How to send a request via SOCKS proxy.

 *

 * @since 4.1

 */

public class ClientExecuteSOCKS {


    public static void main(String[] args) throws Exception {

        Registry<ConnectionSocketFactory> reg = RegistryBuilder

                .<ConnectionSocketFactory> create()

                .register("http", new MyConnectionSocketFactory()).build();

        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(

                reg);

        CloseableHttpClient httpclient = HttpClients.custom()

                .setConnectionManager(cm).build();

        try {

            InetSocketAddress socksaddr = new InetSocketAddress(

                    "mysockshost", 1234);

            HttpClientContext context = HttpClientContext.create();

            context.setAttribute("socks.address", socksaddr);


            HttpHost target = new HttpHost("localhost", 80, "http");

            HttpGet request = new HttpGet("/");


            System.out.println("Executing request " + request + " to "

                    + target + " via SOCKS proxy " + socksaddr);

            CloseableHttpResponse response = httpclient.execute(target,

                    request, context);

            try {

                System.out

                        .println("----------------------------------------");

                System.out.println(response.getStatusLine());

                EntityUtils.consume(response.getEntity());

            } finally {

                response.close();

            }

        } finally {

            httpclient.close();

        }

    }


    static class MyConnectionSocketFactory implements

            ConnectionSocketFactory {


        @Override

        public Socket createSocket(final HttpContext context)

                throws IOException {

            InetSocketAddress socksaddr = (InetSocketAddress) context

                    .getAttribute("socks.address");

            Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr);

            return new Socket(proxy);

        }


        @Override

        public Socket connectSocket(final int connectTimeout,

                final Socket socket, final HttpHost host,

                final
展开阅读全文