2009-10-17 41 views
3

我試圖找到一種方法來強制Jar通過我的代理服務器(在本地主機上運行)(也是Java應用程序)對外部IP進行的任何連接嘗試。 一旦代理服務器接收到連接,它將打開與外部IP的連接並開始將IO與客戶機/服務器進行路由。啓動選項以強制Java套接字連接到本地主機?

我一直在谷歌搜索這2天,我沒有任何運氣,我相信我在我的搜索嘗試中使用錯誤的條款。

如果您有任何想法,請讓我知道,我會嘗試任何。

在此先感謝。 - 肖恩。

+0

同樣在這裏討論:http://stackoverflow.com/questions/1432961/how-do-i-make-httpurlconnection-use-a-proxy – 2010-03-04 20:14:27

回答

4

如果是一個「真正的」代理的,你可以指定代理使用JA使用VA系統屬性。

你有兩種選擇:

  1. 指定命令行代理
  2. 硬編碼到您的應用程序

那麼你實際上有三個

  • 指定一個.properties文件,並從那裏讀取,並將其設置爲系統屬性(這幾乎是選項2,但更動態)
  • 從命令行您將使用:

    java -Dhttp.proxyHost=localhost -Dhttp.proxyPort=8080 -jar YourJar.jar 
    

    隨着所有的HTTP連接執行將通過localhost在端口8080

    二是在main方法添加此你的程序:

    public static void main(String [] args) { 
        System.setProperty("http.proxyHost", "localhost"); 
        System.setProperty("http.proxyPort", "8080"); 
        ..... 
    } 
    

    這是一樣的。

    myapp.properties

    public static void main(String [] args) { 
        try { // there are cleaner ways of course 
         ResorceBundle bundle = ResourceBundle.getBundle("myapp"); 
         System.setProperty("http.proxyHost", bundle.getString("proxy.server")); 
         System.setProperty("http.proxyPort", bundle.getString("proxy.port")); 
        } catch(MissingResourceException missingResourceException){} 
        .... 
    } 
    

    最後加載你只需要確保myapp.properties可從classpath

    有關此功能的更多信息here

    1

    如果你問一般(NOT HTTP/FTP特定!)代理Socket連接,那麼簡單的答案是它不被Java支持。

    當您爲HTTP和FTP流量配置代理時,代理髮生在應用程序協議級別。 Java端代理屬性告訴URLConnection層連接到您指定的代理,而不是您應用程序試圖連接到的URL的IP地址。 Java Socket級別不知道發生了這種情況。它只是看到連接到代理的請求。

    這項工作是因爲HTTP和FTP協議專門支持代理。例如,HTTP GET請求消息的第一行'給出了客戶端請求的頁面的完整URL。如果GET請求進入代理,代理可以找出需要發送的地址。

    從Socket級別的代理問題來看,第一個觀察結果是標準Java類庫不支持這一點。第二個觀察結果是,它實際上是無法實現的......除非你將它作爲一個替代傳輸層實現。原因是IP和TCP/IP根本不支持顯式代理或中繼消息/流的概念。即使你實現了這種傳輸,它也不適合標準的Socket模型。

    所以,如果你是真的詢問大約代理Java應用程序的網絡流量都,這隻能在JVM之外執行;即在JVM(物理或虛擬)主機操作系統的網絡傳輸級別上。

    +0

    我不完全同意這一點。自Java 1.5以來,內置對SOCKS代理的支持(請參閱'java.net.Socket(代理代理)'的構造函數)。但是,是的,對於HTTP協議,需要一些額外的層來處理它。 Apache'commons-httpclient'開發人員承諾在4.x版本的庫中添加此支持(請參閱http://wiki.apache.org/HttpComponents/FrequentlyAskedApplicationDesignQuestions#Proxy_Configuration)。 – 2010-03-04 20:05:07

    +0

    並且...是...有完整的代理支持(至少在Java 6中以及HTTP和FTP)。參見'sun.net.www.protocol.ftp.FtpURLConnection#connect()'和'sun.net.www.protocol.http.HttpURLConnection#plainConnect()'。另外支持身份驗證。 – 2010-03-04 20:12:51