首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2SE 5.0 代理服務器配置全攻略:系統屬性、Proxy 類與 ProxySelector 進階應用

     編輯:Java 相關知識

歷史包袱與 5.0 突破

J2SE 1.5 (5.0) 前代理配置極不靈活。5.0 引入細粒度控制:可分別針對 HTTP、HTTPS、FTP、SOCKS 設置代理,支持繞過列表(通配符),體驗與瀏覽器設置一致。

三種配置方式

1. JVM 啟動參數 / 系統屬性 (全局生效)

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");

2. Proxy 類實例 (精確控制單次連接)

// 創建指定類型的 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();
// ...

3. ProxySelector (實現負載均衡、故障轉移)

繼承 ProxySelector 覆寫 select(URI) 返回代理列表,connectFailed 處理失效節點。註冊為默認選擇器:

ProxySelector.setDefault(new MyLoadBalancingProxySelector());

完整可運行示例 (NetProxy.java)

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 實例按請求動態選擇出口 IP
  • 高可用:自定義 ProxySelector 實現健康檢查與自動切換
  • 調試技巧:-DproxySet=true -DproxyHost=... -DproxyPort=... 快速驗證

總結

J2SE 5.0 通過系統屬性、Proxy 類、ProxySelector 三層抽象,覆蓋從簡單全局代理到複雜負載均衡的全譜系需求。理解三者優先級與適用場景,是構建健壯網絡應用的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved