J2SE 1.5 (5.0) 前代理配置極不靈活。5.0 引入細粒度控制:可分別針對 HTTP、HTTPS、FTP、SOCKS 設置代理,支持繞過列表(通配符),體驗與瀏覽器設置一致。
Properties prop = System.getProperties();
// HTTP
prop.setProperty("http.proxyHost", "10.10.0.96");
prop.setProperty("http.proxyPort", "8080");
prop.setProperty("http.nonProxyHosts", "localhost|10.10.*"); // 繞過列表
// HTTPS (無獨立 nonProxyHosts,遵循 HTTP 設置)
prop.setProperty("https.proxyHost", "10.10.0.96");
prop.setProperty("https.proxyPort", "443");
// FTP
prop.setProperty("ftp.proxyHost", "10.10.0.96");
prop.setProperty("ftp.proxyPort", "2121");
prop.setProperty("ftp.nonProxyHosts", "localhost|10.10.*");
// SOCKS
prop.setProperty("socksProxyHost", "10.10.0.96");
prop.setProperty("socksProxyPort", "1080");
// 創建指定類型的 Proxy 實例
SocketAddress addr = new InetSocketAddress("10.10.0.96", 1080);
Proxy socksProxy = new Proxy(Proxy.Type.SOCKS, addr);
// 使用時傳入 URLConnection.openConnection(proxy)
URL url = new URL("https://blog.csdn.com/smallnest");
URLConnection conn = url.openConnection(socksProxy);
conn.setConnectTimeout(3000);
InputStream in = conn.getInputStream();
// ...
繼承 ProxySelector 覆寫 select(URI) 返回代理列表,connectFailed 處理失效節點。註冊為默認選擇器:
ProxySelector.setDefault(new MyLoadBalancingProxySelector());
package com.kuaff.jdk5package;
import java.io.*;
import java.net.*;
import java.util.*;
public class NetProxy {
// 設置系統屬性代理
public void setLocalProxy() { /* 如上系統屬性代碼 */ }
public void removeLocalProxy() { /* 移除所有 proxy 屬性 */ }
// 測試 HTTP/FTP 連接,支持可選 Proxy 參數
public void showHttpProxy(Object... proxy) { /* 通用連接邏輯 */ }
public void showFtpProxy(Object... proxy) { /* 同 HTTP */ }
// 工廠方法創建 Proxy
public Proxy getProxy(Proxy.Type type, String host, int port) {
return new Proxy(type, new InetSocketAddress(host, port));
}
public static void main(String[] args) {
NetProxy proxy = new NetProxy();
proxy.setLocalProxy(); // 方式 1:系統屬性
proxy.showHttpProxy(); // 使用系統默認代理
// proxy.removeLocalProxy();
// proxy.showHttpProxy(proxy.getProxy(Proxy.Type.SOCKS, "10.10.0.96", 1080)); // 方式 2:顯式 Proxy
}
}
Proxy 實例按請求動態選擇出口 IPProxySelector 實現健康檢查與自動切換-DproxySet=true -DproxyHost=... -DproxyPort=... 快速驗證J2SE 5.0 通過系統屬性、Proxy 類、ProxySelector 三層抽象,覆蓋從簡單全局代理到複雜負載均衡的全譜系需求。理解三者優先級與適用場景,是構建健壯網絡應用的必修課。