2011-04-18 48 views
6

我使用100%工作襪子,無法通過我的應用程序進行連接。 如何在Java中使用SOCKS?

 
     SocketAddress proxyAddr = new InetSocketAddress("1.1.1.1", 12345); 
     Proxy pr = new Proxy(Proxy.Type.SOCKS, proxyAddr);

try 
    { 
     HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(pr); 
     con.setConnectTimeout(proxyTimeout * 1000); 
     con.setReadTimeout(proxyTimeout * 1000); 
     con.connect(); 

     System.out.println(con.usingProxy()); 
    } 
    catch(IOException ex) 
    { 
     Logger.getLogger(Enter.class.getName()).log(Level.SEVERE, null, ex); 
    } 

那麼我做錯了什麼?如果我將HTTP與一些HTTP代理一起使用,但所有工作都不能使用SOCKS。

回答

12

這真的很容易。你只需要設置相關的系統屬性,並開始使用常規的HttpConnection。

System.getProperties().put("proxySet", "true"); 
System.getProperties().put("socksProxyHost", "127.0.0.1"); 
System.getProperties().put("socksProxyPort", "1234"); 
+0

這些都是正確的,但是如果我需要使用多線程並且我需要每次有很多代理,該怎麼辦? 例如我發現襪子代理在IE中可以正常工作(並且不支持HTTP和其他協議),但是當我在Java中使用它時,它不適用於v4和5!這似乎像擁抱Java一樣 – AnNik 2016-11-23 02:29:45

1

http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/net/www/http/HttpClient.java/?v=source

內心深處,HttpClient的在HttpURLConnection的使用。

if ((proxy != null) && (proxy.type() == Proxy.Type.HTTP)) { 
    sun.net.www.URLConnection.setProxiedHost(host); 
    privilegedOpenServer((InetSocketAddress) proxy.address()); 
    usingProxy = true; 
    return; 
} else { 
    // make direct connection 
    openServer(host, port); 
    usingProxy = false; 
    return; 
} 

在第476行,您可以看到唯一可接受的代理是HTTP代理。否則它會直接連接。

奇怪的是,使用HttpURLConnection不支持SOCKS代理。更糟的是,代碼甚至沒有使用不支持的代理,只是忽略代理!

爲什麼沒有任何支持SOCKS代理至少10年的這個類的存在無法解釋。

2

通知「socksProxyHost」和「socksProxyPort」VM參數。

例如

java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8080 org.example.Main