问题背景

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

总结

除了上述 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

Java程序通过代理访问网络相关推荐

  1. iterm通过代理访问网络

    下载fabric的docker镜像的时候,mac已经开了代理,但速度还是巨慢,原来iterm通过代理访问网络还要单独设置,在~/.zshrc 或者~/.bash_profile 配置文件中添加如下配置 ...

  2. python通过代理访问网页_【已解决】Python中使用代理访问网络

    [问题] 在用Python的urllib2等库,访问网络,发现某些网址访问很慢,比如: 但是,当使用代理(此处用的是gae)后,发现访问速度就快很多了. 所以,希望给Python的访问网络,增加代理的 ...

  3. java程序通过http代理访问网络获取节假日数据

    最近接到一个需求,需要计算工作日,比如某个周一调休放假,某个周六调休上班,由于节假日的安排是国家发布的,我们的系统是在内网,那就需要根据国家发布的安排在自己的数据库里记录,想到如果对着日历去录数据那就 ...

  4. java通过代理访问网络

    使用代理方式连接到网络 @Testpublic void t13(){String charset = "utf-8" ; String proxyHost = "代理地 ...

  5. JAVA程序员常用访问网址

    技术桟更新总有一些不得不访问的官网不得不记录下来,放在本地太容易忘了,分享一波,也是为了防止自己忘了!!!写到哪儿算哪儿 国家严打版本问题,hacker类文章不能看了!就离谱 目录 1.记事本工具 2 ...

  6. 一个JAVA程序员经常访问的网站

    综合技术网站: CSDN              http://www.csdn.net/ 51CTO             http://www.51cto.com/ 开源中国社区   http ...

  7. 为诺基亚S40手机添加java程序的cmwap代理配置!

    很多用诺基亚S40手机的朋友会发现这样一个问题,只要使用cmwap接入点,不论网络怎样设置,有些java程序就是不能联网,比如Opera Mini和英文版的Google Maps,而使用cmnet就可 ...

  8. 代理ip让用户访问网络不受限

    网络业内人士对于代理ip应该是十分熟悉的,由于很多网站访问的受限,很多人无法顺利的访问一些网站.尤其是对于一些国外网站想要访问都会受到IP地址的限制.那么该如何才能避免被受限呢?这就需要使用代理服务器 ...

  9. 《Linux运维总结:内网服务器通过代理访问外网服务器(方法一)》

    一.背景 说明:192.168.1.191可以上外网,192.168.1.192不能上外网,需要使用代理的方法实现192.168.1.192主机可以访问外网. 内网ip 外网ip 操作系统 192.1 ...

最新文章

  1. 所有表单对象_Laravel 表单方法伪造与 CSRF 攻击防护
  2. c语言坐标扫雷程序,用C语言写一个扫雷程序
  3. 使用Jdom2将一个xml文件添加到另一个xml中
  4. Zinterstore 命令
  5. 编译安装Centos7.2+Apache2.4.25+PHP7.2.10+Mysql5.6.16
  6. 发布 128 核 Altra Max,自研内核,明年推出 5nm 处理器,“性能怪兽”Ampere 搞大事?
  7. python建模仿真 matlab_清华大学出版社-图书详情-《仿真建模与MATLAB实用教程》
  8. metamask插件_Remix+metamask+myetherwallet+Ciper 完成主网发币(实战 十)
  9. java 数字千分位_java实现数字千分位的显示
  10. 印象笔记 离线版_印象笔记离线版
  11. 拍视频用30帧还是60帧更好,帧率如何设置60帧的问题
  12. 新浪微博PC端登陆js分析及Python实现微博post登陆
  13. Jetpack 架构组件:Room 数据库应用
  14. 哈利波特系列之伏地魔生平
  15. 多模态情感分析的研究现状
  16. 打造APP引导页3D切换特效
  17. 关于项目运行或者打包出现“primordials is not defined”导致运行或打包失败问题
  18. 研究生必备快速查找翻译阅读外文文献方法
  19. 计算机系统对工业相机影响,如何理解工业相机的校准
  20. python星号和双星号的区别

热门文章

  1. C/C++标准库到底是什么?
  2. 2014年24如何改变球段魔尺视频教程
  3. 软编码Flv 到Mp4 容器(五) fmp4 ftyp box 和moovmvhd box详解
  4. 2019-2020-2 20175227张雪莹《网络对抗技术》 Exp2 后门原理与实践
  5. Type c手机怎么实现一边充电一边听歌(边充边听放方案)
  6. CodeForces 520B Two Buttons
  7. 获取手机设备型号、系统版本、手机型号等信息
  8. 从知道到懂得,从懂得到做到
  9. 三角洲杂志三角洲杂志社三角洲编辑部2023年第9期目录
  10. 矩阵运算库 C语言 (Matrix_hub)