Java程序通过代理访问网络
问题背景
最近工作上有开发爬虫的任务,对目标网站数据进行抓取,由于大部分网站都在国外,无法直接访问,需要通过代理才能登录。爬虫部署的服务器在香港,所以爬虫部署到服务器后,是可以访问目标网站的,但本地开发调试程序时,需要通过代理才能访问。
这篇文章就带大家了解一下如何在Java程序中使用代理访问网络。
解决方案
你需要一个代理服务器,和一个可以连接到此服务器的客户端。
花点银子买一个稳定的账号,或者自己搭建一个。
这里我使用自己搭建的Shadowsocks代理服务器,使用Shadowsocks-Windows作为本地代理的客户端,并开启默认的1080端口,以供本地其他程序通过代理访问网络。
- 指定 Java 程序的代理服务器地址和端口
有两种指定方式:
通过 命令行参数 指定
如果只需要考虑代理 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在程序中使用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等网站。
总结
除了上述 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
原文链接:http://xueliang.org/article/detail/20170116145848852
Java程序通过代理访问网络的更多相关文章
- 在Linux终端下使用代理访问网络(转)
最近,需要在linux环境下使用脚本进行一些网络访问(主要是HTTP请求与文件下载),于是查阅了一些关于代理的资料. 以下是尝试的几种代理设置方法,以供参考: 一.使用wget命令进行代理访问 wge ...
- Idea代理设置与Java程序的代理设置
最近在学习WebService的过程中,为了弄清楚发送和接收的包的数据结构,使用Fiddler抓取包的数据.开始先配置了Idea的代理设置,但执行Java代码发送请求时,依然无法在Fiddler中抓取 ...
- 微信小程序封装http访问网络库实例代码
之前都是使用LeanCloud为存储,现在用传统API调用时做如下封装 var HOST = 'http://localhost/lendoo/public/index.php/'; // 网站请求接 ...
- 一个JAVA程序员经常访问的网站
综合技术网站: CSDN http://www.csdn.net/ 51CTO http://www.51cto.com/ 开源中国社区 http:/ ...
- [转]C# 使用代理访问网络
本文部分内容来自:https://zhidao.baidu.com/question/563196409.html 也可以参考:http://www.cnblogs.com/stuart/p/5442 ...
- java中设置代理的两种方式
1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式. ...
- 使用HTTP访问网络------使用HTTPURLConnection
HTTPURLConnection继承了URLConnection,因此也可用于向指定网站发送GET请求.POST请求.它在URLConnection的基础上提供了如下便捷的方法: 1.int ge ...
- Java Http 设置代理
1.今天在Eclipse下面编译一个Http客户端时,发现可以连接局域网,连接不上外部网络,突然想起所用PC是通过代理访问网络的,设置代理后程序可以正常访问网络了: Properties props ...
- Java 网络编程(三) 创建和使用URL访问网络上的资源
链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951877.html 创建和使用URL访问网络上的资源 URL(Uniform Reso ...
随机推荐
- 淘宝的数据库拆分(TDDL)(转)
淘宝的数据拆分历程 系 统刚开始的时候,因为系统刚上线,用户不多,那个时候,所有的数据都放在了同一个数据库中,这个时候因为用户少压力小,一个数据库完全可以应付的了,但是 随着运营那些哥们辛苦的呐喊和拼 ...
- tomcat 错误查看
路径 : \tomcat\logs 清除日志,重新启动生成 从上到下,依次查看错误,可以看到,上面的两个是系统的启动模块.然后第三行错误提示,明显指出了错误原因 “NoClassDefFoundErr ...
- Unity跨平台原理
An ahead-of-time (AOT) compiler is a compiler that implements ahead-of-time compilation. This refers ...
- cookie、session、sessionid的区别
我们都知道银行,银行的收柜台每天要接待客户存款/取款业务,可以有几种方案: 1.凭借柜台职员的记忆,由收柜台职员来为每位顾客办理存款/取款业务,单凭职员的记忆力,要记到每位顾客的相貌,并迅速这个顾客当 ...
- [Machine Learning] 深度学习中消失的梯度
好久没有更新blog了,最近抽时间看了Nielsen的<Neural Networks and Deep Learning>感觉小有收获,分享给大家. 了解深度学习的同学可能知道,目前深度 ...
- ECMAScript 6 笔记(三)
ES6中的基本扩展 一.函数的扩展 1. 函数参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') { console ...
- WinForm 对话框、流
一.对话框 ColorDialog:颜色选择控件 private void button1_Click(object sender, EventArgs e) { //显示颜色选择器 colorDia ...
- jQuery --checkbox全选和取消全选简洁高效的解决办法
最近在公司做了一个小项目,其中有一个全选和取消全选的这么一个模块,搞了半天找不到一种最佳的解决方案!后来通过各种努力找到了一种简洁高效的解决办法,这里想和大家分享一下.有问题的话,还望各路大神指导一二 ...
- [Linux] PHP程序员玩转Linux系列-怎么安装使用
现在服务器主流都是Linux系统,主流发行版是CentOS,最新的CentOS版本号是7.3,我公司使用的是CentOS6.5,所以,我还是主要去学习6.x版本的CentOS.桌面版的Linux系统中 ...
- ABP入门系列(11)——编写单元测试
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 前言 In computer programming, unit testing is a ...