Java程序通过代理访问网络

问题背景

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

解决方案

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

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

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

      -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080
           
           
      • 1

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

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

      最终填写的值为:

      -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080
           
           
      • 1
    2. 在程序中使用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);
           
           
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

    推荐使用第一种方案,通过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));
          }
      }
    }
       
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 测试结果,可以正常访问Google等网站。 
    Java通过代理访问google.com结果

总结

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

协议 属性(代理主机/代理端口/不使用代理的主机列表) 默认值
HTTP http.proxyHost <none>
http.proxyPort 80
http.nonProxyHosts <none>
HTTPS https.proxyHost <none>
https.proxyPort 443
https.nonProxyHosts <none>
FTP ftp.proxyHost <none>
ftp.proxyPort 80
ftp.nonProxyHosts <none>
SOCKS socksProxyHost <none>
socksProxyPort 1080

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

转载自:https://xueliang.org/article/detail/20170116145848852

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值