【问题标题】:How to load a URL in Java using a proxy using Apache HttpClient?如何使用 Apache HttpClient 使用代理在 Java 中加载 URL?
【发布时间】:2014-03-07 06:13:23
【问题描述】:

您好,我正在尝试使用 Apache HttpClient 在 JAVA 中使用服务器的 URL 来测试响应时间

这是我的代码

    HttpClient client = new HttpClient();
    HttpMethod method = new HeadMethod("http://www.google.com/");
    StopWatch sWatch = new StopWatch();

    try {

        sWatch.start();
    client.executeMethod(method);

    System.out.println(sWatch.toString());

    }catch(Exception e)
    {
        e.printStackTrace();
    }

我的问题是我可以从浏览器访问www.google.com,但是当我尝试执行该逻辑时出现此异常

    java.net.ConnectException: Connection timed out: connect
at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:280)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:80)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:122)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at com.sampl.DAP.CheckResponse.checkStatus(CheckResponse.java:31)
at com.sampl.DAP.CheckResponse.main(CheckResponse.java:44)

【问题讨论】:

  • 是否有任何代理服务器用于路由流量?如果是这样,请尝试在您的代码中添加代理设置。
  • 这是一个非常老的http组件版本。考虑升级。
  • @Rakesh 是的,我有代理服务器来路由流量.. 如果是这样,那么如何在我的代码中添加代理设置任何示例 plz
  • @SotiriosDelimanolis 升级?怎么样?

标签: java http url httpclient ping


【解决方案1】:

试试下面的

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author djc39_000
 */
public class URLBrowser {

    public static void main(String[] args) {
        try {            
            URLConnection uc =  new URL("https://www.google.com").openConnection(
                    new Proxy(Proxy.Type.HTTP, new InetSocketAddress("my.proxy.example.com", 3128))
            );
            BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
            String line;            
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
        } catch (MalformedURLException ex) {
            Logger.getLogger(URLBrowser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(URLBrowser.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

我以这种方式对程序进行了格式化,因此如果您没有代理,您可以注释掉该行,而其他一切仍然可以工作。如果您通过制作 var Proxy proxy = new Proxy(...) 来做到这一点,那么您必须注释多行。

【讨论】:

  • 请您详细说明InetSocketAddress("my.proxy.example.com", 3128) plz 吗?
  • "这个类实现了一个IP套接字地址(IP地址+端口号),也可以是一对(主机名+端口号),在这种情况下会尝试解析主机名。如果解析失败,则称该地址未解析,但仍可在某些情况下使用,例如通过代理连接。”
【解决方案2】:

因为您使用的是库。我建议使用jsoup。以下代码已经过测试。

long startTime = System.nanoTime();
Response response= Jsoup.connect(location)
       .ignoreContentType(true)
       .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")  
       .referrer("http://www.google.com")   
       .timeout(12000) 
       .followRedirects(true)
       .execute();
long endTime = System.nanoTime();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2013-10-08
    • 2014-03-30
    • 2011-02-22
    相关资源
    最近更新 更多