• Java程序通过代理访问网络


    问题背景

    最近工作上有开发爬虫的任务,对目标网站数据进行抓取,由于大部分网站都在国外,无法直接访问,需要通过代理才能登录。爬虫部署的服务器在香港,所以爬虫部署到服务器后,是可以访问目标网站的,但本地开发调试程序时,需要通过代理才能访问。
    这篇文章就带大家了解一下如何在Java程序中使用代理访问网络。

    解决方案

    • 你需要一个代理服务器,和一个可以连接到此服务器的客户端。
      花点银子买一个稳定的账号,或者自己搭建一个。
      这里我使用自己搭建的 Shadowsocks 代理服务器,使用 Shadowsocks-Windows 作为本地代理的客户端,并开启默认的 1080 端口,以供本地其他程序通过代理访问网络。
      编辑服务器信息

    • 指定 Java 程序的代理服务器地址和端口
      有两种指定方式:

      1. 通过 命令行参数 指定
        如果只需要考虑代理 HTTP 协议请求,只需添加如下命令行参数:
      -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080
      

      想要 HTTP 和 HTTPS 协议的请求都通过代理访问网络,可以追加上:

      -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080
      

      最终填写的值为:

       -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080
      
      1. 在程序中使用System.setProperty(String, String)
        同样很简单,这里直接上代码:
      String proxyHost = "127.0.0.1";
      String proxyPort = "1080";
            
      System.setProperty("http.proxyHost", proxyHost);
      System.setProperty("http.proxyPort", proxyPort);
            
      // 对https也开启代理
      System.setProperty("https.proxyHost", proxyHost);
      System.setProperty("https.proxyPort", proxyPort);
      

    推荐使用第一种方案,通过VM Option 的方式,对代码没有任何侵入,绿色环保。

    测试

    这里我在Eclipse中使用第一种方法进行测试。

    • 测试代码
      import java.io.IOException;
      import java.io.InputStream;
      import java.net.URL;
      import java.net.URLConnection;
      public class Test {
          public static void main(String[] args) throws IOException {
              URL url = new URL("https://google.com");
              URLConnection connection = url.openConnection();
              connection.connect();
              InputStream inputStream = connection.getInputStream();
              byte[] bytes = new byte[1024];
              while (inputStream.read(bytes) >= 0) {
                  System.out.println(new String(bytes));
              }
          }
      }
      
    • 测试结果,可以正常访问Google等网站。
      Java通过代理访问google.com结果

    总结

    除了上述 http.proxyHosthttp.proxyPort,以及 https.proxyHosthttps.proxyPort 在代理时比较有用外,还有一个属性也比较有用,那就是 http.nonProxyHosts,它用来指定哪些主机不使用代理,如果有多个,用英文竖线(|)分隔,可以使用星号 (*)作为通配符。
    下表是常用协议对应的代理属性:

    协议属性(代理主机/代理端口/不使用代理的主机列表)默认值
    HTTPhttp.proxyHost<none>
    http.proxyPort80
    http.nonProxyHosts<none>
    HTTPShttps.proxyHost<none>
    https.proxyPort443
    https.nonProxyHosts<none>
    FTPftp.proxyHost<none>
    ftp.proxyPort80
    ftp.nonProxyHosts<none>
    SOCKSsocksProxyHost<none>
    socksProxyPort1080

    详细介绍请参考官方说明:Java Networking and Proxies

    原文链接http://xueliang.org/article/detail/20170116145848852

  • 相关阅读:
    eharts入门篇一
    手机侧滑导航栏
    用js+cookie实现商城的购物车功能
    实现文字底部居中
    超出两行或三行显示省略号
    clear-fix清除浮动的两种写法
    sass学习入门篇(三)
    如何回答面试中问到的Hibernate和MyBatis的区别
    设计模式之--单例模式
    设计模式之---工厂模式
  • 原文地址:https://www.cnblogs.com/liangzai-cool/p/6291384.html
Copyright © 2020-2023  润新知