资讯专栏INFORMATION COLUMN

Java程序通过代理访问网络

garfileo / 1675人阅读

问题背景

最近工作上有开发爬虫的任务,对目标网站数据进行抓取,由于大部分网站都在国外,无法直接访问,需要通过代理才能登录。爬虫部署的服务器在香港,所以爬虫部署到服务器后,是可以访问目标网站的,但本地开发调试程序时,需要通过代理才能访问。
这篇文章就带大家了解一下如何在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.proxyHosthttp.proxyPort,以及 https.proxyHosthttps.proxyPort 在代理时比较有用外,还有一个属性也比较有用,那就是 http.nonProxyHosts,它用来指定哪些主机不使用代理,如果有多个,用英文竖线(|)分隔,可以使用星号 (*)作为通配符。
下表是常用协议对应的代理属性:

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66495.html

相关文章

  • Burp Suite抓包讲解

    摘要:环境运行时依赖,需提前安装环境。抓包就是将网络传输发送与接收的数据包进行截获重发编辑转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。 目录 Bur...

    不知名网友 评论0 收藏0
  • Java 知识小集

    摘要:锁的两种主要特性互斥同一时间只允许一个线程持有某个特定的锁。可见性线程释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的。在商业上的成功奠定了字符存储以位即一个字节为单位的基础。 1.锁的两种主要特性: 互斥:同一时间只允许一个线程持有某个特定的锁。线程持有该锁相当于令牌去访问线程共享的数据。可见性:线程释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的...

    XBaron 评论0 收藏0
  • 深入理解代理模式

    摘要:代理模式代理类中创建一个真实对象的实例模式的核心装饰者强调的是增强自身,在被装饰之后你能够在被增强的类上使用增强后的功能。 代理模式 在详细了解代理模式之前,可能对于像小秋一样的小白,只知道一些很浅显的概念,或者就知道远程代理啊,静态代理啊,动态代理啊,这些看似可以望文生义的专业名词,但是如果我告诉你代理模式贯穿了我们生活的方方面面,就比如你现在刷着公众号的时候,实际上就用了远程代理模...

    testHs 评论0 收藏0
  • WebService就是这么简单

    摘要:它使用方式,接收和响应外部系统的某种请求。回顾我们在学习基础网络编程章节已经知道了这么一个连接了。使用指定名称的命名空间。名词简单对象访问协议作为一个基于语言的协议用于有网上传输数据。以的根元素出现。代理这么一个概念就更加清晰了。 WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧.... 问题一 如果我们的网站需要提供一个天气预报这样一个需求...

    SwordFly 评论0 收藏0

发表评论

0条评论

garfileo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<