HttpClient 实现 socks 代理
使用的环境
1 2 3 4 5 6 7 8 9 10 | < dependency > < groupId >org.apache.httpcomponents</ groupId > < artifactId >httpclient</ artifactId > < version >4.4.1</ version > </ dependency > < dependency > < groupId >org.apache.httpcomponents</ groupId > < artifactId >httpcore</ artifactId > < version >4.4.1</ version > </ dependency > |
代码及 ConnectionSocketFactory 实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | package xxx; import com.lucas.admin.util.HttpClientUtil; import org.apache.http.HttpEntity; 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; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 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.ssl.SSLContexts; import org.apache.http.util.EntityUtils; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.Socket; /** * @author kzcming * @since 2020/11/19 15:51 */ public class Test { public static void main(String[] args) throws Exception { } public static void test(String url) throws Exception{ // ConnectionSocketFactory注册 Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create() .register( "http" , new MyConnectionSocketFactory()) .register( "https" , new MySSLConnectionSocketFactory()).build(); // HTTP客户端连接管理池 PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(reg); CloseableHttpClient httpclient = HttpClients.custom() .setConnectionManager(connManager) .build(); try { // socks代理地址 , socks 地址和端口,这里随便写了一个1008 InetSocketAddress socksaddr = new InetSocketAddress( "你的地址" , 1008 ); HttpClientContext context = HttpClientContext.create(); context.setAttribute( "socks.address" , socksaddr); // 请求目标 HttpGet request = new HttpGet(url); System.out.println( "----------------------------------------" ); System.out.println( "执行请求 :" + request.getRequestLine()); System.out.println( "通过代理: " + socksaddr); System.out.println( "----------------------------------------" ); CloseableHttpResponse response = httpclient.execute(request, context); try { HttpEntity entity = response.getEntity(); System.out.println( "----------------------------------------" ); System.out.println( "返回响应:" + response.getStatusLine()); System.out.println( "响应内容:" + EntityUtils.toString(entity)); System.out.println( "----------------------------------------" ); } finally { response.close(); } } finally { httpclient.close(); } } /** * 实现 http 链接的socket 工厂 */ static class MyConnectionSocketFactory extends PlainConnectionSocketFactory { @Override public Socket createSocket( final HttpContext context) throws IOException { InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute( "socks.address" ); // socket代理 Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); return new Socket(proxy); } } /** * 实现 https 链接的socket 工厂 */ static class MySSLConnectionSocketFactory extends SSLConnectionSocketFactory { public MySSLConnectionSocketFactory() { super (SSLContexts.createDefault(), getDefaultHostnameVerifier()); } @Override public Socket createSocket( final HttpContext context) throws IOException { InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute( "socks.address" ); // // socket代理 Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); return new Socket(proxy); } } } |
以上就是Java HttpClient 实现 socks 代理的示例代码的详细内容,更多关于Java HttpClient 实现 socks 代理的资料请关注自学编程网其它相关文章!
- 本文固定链接: https://zxbcw.cn/post/200422/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)