【问题标题】:How to use URLConnection Timeout如何使用 URLConnection 超时
【发布时间】:2011-09-25 15:54:06
【问题描述】:

我正在尝试对 SOCKS 代理列表进行排序,并找出哪些代理的连接和读取时间小于 1000 毫秒,这是我的代码

for(Proxy p : proxies) {
            try {
            URLConnection testConnection = testUrl.openConnection(p);
            testConnection.setConnectTimeout(TIMEOUT_VALUE);
            testConnection.setReadTimeout(TIMEOUT_VALUE);
            success.add(p);
            } catch(SocketTimeoutException ste) {
                System.out.println("Proxy " + p.address().toString() + " timed out.");
            }
        }

但是他们每个人都通过了测试,即使我做了TIMEOUT_VALUE = 1; 我做错了什么?感谢您的帮助。

【问题讨论】:

  • 你能添加这一行,看看它返回的值是多少? testConnection.getConnectTimeout()
  • 我的意思是在设置超时值后添加。
  • @CoolBeans 它只是打印出 1000,就像它应该的那样。
  • 我在java docs 上看到了这个此方法的一些非标准实现可能会忽略指定的超时。我不确定这些 non-standard 实现是什么。

标签: java proxy socks


【解决方案1】:

我认为您的问题是您没有从连接中读取任何内容。如果我将TIMEOUT_VALUE 设置得太低,则会出现异常。无论我阅读所有响应还是仅一行都不会影响结果时间,我想这是因为我在一个数据包中得到了完整的答案。

这是我使用的测量值(没有代理):

    int TIMEOUT_VALUE = 1000;
    try {
        URL testUrl = new URL("http://google.com");
        StringBuilder answer = new StringBuilder(100000);

        long start = System.nanoTime();

        URLConnection testConnection = testUrl.openConnection();
        testConnection.setConnectTimeout(TIMEOUT_VALUE);
        testConnection.setReadTimeout(TIMEOUT_VALUE);
        BufferedReader in = new BufferedReader(new InputStreamReader(testConnection.getInputStream()));
        String inputLine;

        while ((inputLine = in.readLine()) != null) {
            answer.append(inputLine);
            answer.append("\n");
        }
        in.close();

        long elapsed = System.nanoTime() - start;
        System.out.println("Elapsed (ms): " + elapsed / 1000000);
        System.out.println("Answer:");
        System.out.println(answer);
    } catch (SocketTimeoutException e) {
        System.out.println("More than " + TIMEOUT_VALUE + " elapsed.");
    }

【讨论】:

  • 感谢这似乎有效,对于添加的措施,我在将其添加到成功列表之前检查经过的时间是否小于超时值。再次感谢!
【解决方案2】:

我用

    System.getProperties().put("proxySet", "true");
    System.getProperties().put("http.proxyHost", "192.168.10.121");
    System.getProperties().put("http.proxyPort", "8080");
    //System.getProperties().put("http.nonProxyHosts", "8080");

【讨论】:

  • 对我有用。您还可以使用 Proxy 类来限制副作用,而不是更改系统属性(尤其是在像服务器这样的多线程环境中)。
  • proxySet 在任何已发布的 JVM 中什么都不做。
猜你喜欢
  • 2016-08-13
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 2016-03-09
相关资源
最近更新 更多