Java程序通过代理访问网络
問(wèn)題背景
最近工作上有開發(fā)爬蟲的任務(wù),對(duì)目標(biāo)網(wǎng)站數(shù)據(jù)進(jìn)行抓取,由于大部分網(wǎng)站都在國(guó)外,無(wú)法直接訪問(wèn),需要通過(guò)代理才能登錄。爬蟲部署的服務(wù)器在香港,所以爬蟲部署到服務(wù)器后,是可以訪問(wèn)目標(biāo)網(wǎng)站的,但本地開發(fā)調(diào)試程序時(shí),需要通過(guò)代理才能訪問(wèn)。
這篇文章就帶大家了解一下如何在Java程序中使用代理訪問(wèn)網(wǎng)絡(luò)。
解決方案
你需要一個(gè)代理服務(wù)器,和一個(gè)可以連接到此服務(wù)器的客戶端。
花點(diǎn)銀子買一個(gè)穩(wěn)定的賬號(hào),或者自己搭建一個(gè)。
這里我使用自己搭建的 Shadowsocks 代理服務(wù)器,使用 Shadowsocks-Windows 作為本地代理的客戶端,并開啟默認(rèn)的 1080 端口,以供本地其他程序通過(guò)代理訪問(wèn)網(wǎng)絡(luò)。
指定 Java 程序的代理服務(wù)器地址和端口
有兩種指定方式:
通過(guò) 命令行參數(shù) 指定
如果只需要考慮代理 HTTP 協(xié)議請(qǐng)求,只需添加如下命令行參數(shù):
-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080
想要 HTTP 和 HTTPS 協(xié)議的請(qǐng)求都通過(guò)代理訪問(wèn)網(wǎng)絡(luò),可以追加上:
-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)
同樣很簡(jiǎn)單,這里直接上代碼:
String proxyHost = "127.0.0.1";
String proxyPort = "1080";
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", proxyPort);
// 對(duì)https也開啟代理
System.setProperty("https.proxyHost", proxyHost);
System.setProperty("https.proxyPort", proxyPort);
推薦使用第一種方案,通過(guò)VM Option 的方式,對(duì)代碼沒(méi)有任何侵入,綠色環(huán)保。
測(cè)試
這里我在Eclipse中使用第一種方法進(jìn)行測(cè)試。
測(cè)試代碼
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));
}
}
}
測(cè)試結(jié)果,可以正常訪問(wèn)Google等網(wǎng)站。
總結(jié)
除了上述 http.proxyHost 和 http.proxyPort,以及 https.proxyHost 和 https.proxyPort 在代理時(shí)比較有用外,還有一個(gè)屬性也比較有用,那就是 http.nonProxyHosts,它用來(lái)指定哪些主機(jī)不使用代理,如果有多個(gè),用英文豎線(|)分隔,可以使用星號(hào) (*)作為通配符。
下表是常用協(xié)議對(duì)應(yīng)的代理屬性:
| 協(xié)議 | 屬性(代理主機(jī)/代理端口/不使用代理的主機(jī)列表) | 默認(rèn)值 |
|---|---|---|
| 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 |
詳細(xì)介紹請(qǐng)參考官方說(shuō)明:Java Networking and Proxies
原文鏈接:http://xueliang.org/article/detail/20170116145848852
總結(jié)
以上是生活随笔為你收集整理的Java程序通过代理访问网络的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LinearLayout和Relativ
- 下一篇: UIWindow的windowLevel