2010-06-14 37 views
4

我想通過java代理連接到網站。這是我寫的代碼:使用java中的代理服務器代碼連接到站點

public class ConnectThroughProxy 
{ 
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy ip", 8080)); 
    public static void main(String[] args) 
    { 
     try 
     { 
      URL url = new URL("http://www.rgagnon.com/javadetails/java-0085.html"); 
      URLConnection connection=url.openConnection(); 
      String encoded = new String(Base64.encode(new String("user_name:pass_word").getBytes())); 
      connection.setDoOutput(true); 
      connection.setRequestProperty("Proxy-Authorization","Basic "+encoded); 
      String page=""; 
      String line; 
      StringBuffer tmp = new StringBuffer(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
      while ((line=in.readLine()) != null) 
      { 
       page.concat(line + "\n"); 
      } 
      System.out.println(page); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

試圖運行這段代碼,它拋出以下錯誤:

java.lang.IllegalArgumentException: Illegal character(s) in message header value: Basic dXNlcl9uYW1lOnBhc3Nfd29yZA==
at sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:323)
at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:2054)
at test.ConnectThroughProxy.main(ConnectThroughProxy.java:30)

任何想法怎麼辦呢?

回答

10

如果您只是想通過HTTP代理服務器發出HTTP請求,則不需要付出太多努力。這裏有一個新手必看:http://java.sun.com/javase/6/docs/technotes/guides/net/proxies.html

但它基本上可以歸結爲只是設置http.proxyHost和把http.proxyPort環境屬性,無論是在命令行上,或在代碼:

 
// Set the http proxy to webcache.mydomain.com:8080 
System.setProperty("http.proxyHost", "webcache.mydomain.com"); 
System.setProperty("http.proxyPort", "8080"); 

// Next connection will be through proxy. 
URL url = new URL("http://java.sun.com/"); 
InputStream in = url.openStream(); 

// Now, let's 'unset' the proxy. 
System.clearProperty("http.proxyHost"); 

// From now on HTTP connections will be done directly. 
+0

它成爲一個全球性的環境(JVM範圍的設置),並從內部網站,外部網站的任何其他連接可能會受到影響,那些沒有代理的情況下運行良好。在JDK 1.5之前設置這些系統參數是唯一的選擇,但是從1.5開始,我們擁有提供更好控制的Proxy類。有關詳情,請參閱以下網址:https://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html – 2017-11-08 17:40:30

4

在我看來, ,你根本沒有使用你的Proxy實例。我想你應該通過它,當您創建的URLConnection例如:

URLConnection connection=url.openConnection(proxy); 

環境屬性的設置http.proxy更容易,使用一些第三方庫時沒有代理實例傳遞只支持可能的解決方案,但其缺點是它在整個過程中是全局性的。

2

我用的是谷歌數據API和我的代理服務器設置的工作是提供一切有關代理參數的唯一途徑,甚至認爲他們被設置爲空:

/usr/java/jdk1.7.0_04/bin/java -Dhttp.proxyHost=10.128.128.13 
    -Dhttp.proxyPassword -Dhttp.proxyPort=80 -Dhttp.proxyUserName 
    -Dhttps.proxyHost=10.128.128.13 -Dhttps.proxyPassword -Dhttps.proxyPort=80 
    -Dhttps.proxyUserName com.stackoverflow.Runner 

其中,用戶名和密碼不是必需的,並且相同的http和https服務器被設置爲相同的,以及端口號(如果這是你的情況)。請注意,HTTPS服務器也提供了相同的HTTP代理以及其端口號(參考文獻https://code.google.com/p/syncnotes2google/issues/detail?id=2#c16)。

如果您的Java類有類「URL」的一個實例,應該挑選那些配置了......

相關問題