2014-02-12 112 views
0

我需要使用socks 4代理來調用服務器。我在Java版本1.6。與Socks 4代理進行HTTP通話

如果我們用這樣的事情,然後它把SOCKS代理的版本5

URL url = new URL("https://www.google.com"); 
URLConnection connection = null; 
SocketAddress proxySocketAddress1 = new InetSocketAddress("XXXXXXXXXX", 8081); 
Proxy proxy = new Proxy(Proxy.Type.SOCKS, proxySocketAddress1); 
connection = url.openConnection(proxy); 
connection.setConnectTimeout(150000); 
connection.connect(); 

我可以通過做

// Set SOCKS proxy 
System.getProperties().put("socksProxyHost","xxxxx"); 
System.getProperties().put("socksProxyPort","1234"); 
System.getProperties().put("socksProxyVersion","4"); 

當我做到這一點我在系統級設置socks代理能夠到達服務器

connection = url.openConnection(); 

但我的其他連接像連接到數據庫,加密ption服務器也通過代理失敗。

我也試過,不包括系統代理,但沒有成功服務器。

System.getProperties().put("socksnonProxyHosts","*.net"); 
System.getProperties().put("http.nonProxyHosts","*.net"); 

是否有任何其他方式可以選擇在java 1.6中使用SOCKS4。

+0

'socksnonProxyHosts'未在[Java的網絡和代理(http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html)上市,也沒有這樣的事情。 (無論是'socksProxyVersion,'但@RemyLebeau給出的錯誤鏈接描述爲在Java 7中添加)使用標準JDK庫使用任何SOCKS4代理 – EJP

回答

0

它是SocksSocketImpl實現中的錯誤:

JDK-6964547 : Impossible to set useV4 in SocksSocketImpl

+0

NB它被列爲固定在Java 7中 – EJP

+0

請問有什麼辦法JDK?我讀過這個錯誤,它說 - 「建議的socksProxyVersion屬性不會對通過java.net.Proxy編程設置的SOCKS代理產生任何影響」。這意味着我無法在單獨的套接字連接上進行設置。 – user3280587

+0

你有沒有考慮編寫自己的'Proxy'派生類來自己實現SOCKS v4?手動實現是一個非常簡單的協議。 –

0

這是我嘗試和好像它的工作。基本上我需要SOCKS4代理連接到一個套接字。

SocketAddress socketAddress = new InetSocketAddress("proxyhost",proxyport); 
Proxy socketProxy = new Proxy(Proxy.Type.SOCKS, socketAddress); 

Socket socket = new Socket(socketProxy); 
Class clazzSocks = socket.getClass(); 
Method setSockVersion = null; 
Field sockImplField = null; 
SocketImpl socksimpl = null; 
try { 
    sockImplField = clazzSocks.getDeclaredField("impl"); 
    sockImplField.setAccessible(true); 
    socksimpl = (SocketImpl) sockImplField.get(socket); 
    Class clazzSocksImpl = socksimpl.getClass(); 
    setSockVersion = clazzSocksImpl.getDeclaredMethod("setV4"); 
    setSockVersion.setAccessible(true); 
    if(null != setSockVersion){ 
     setSockVersion.invoke(socksimpl); 
    } 
    sockImplField.set(socket, socksimpl); 
    } 
     catch (Exception e) { 
     // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 

String hostName="xxxxx"; 
int port=1080; 
InetAddress address;   
SocketAddress socketAddress;    
address = InetAddress.getByName(hostName); 
socketAddress = new InetSocketAddress(address, port); 

// Connect to socket 
socket.connect(socketAddress, 100000); 

//setting the socket read() connection time out 
socket.setSoTimeout(100000);  

請分享您的意見,對此方法的反饋。

+0

由於SocksSocketImpl類不公開,所以我使用了反射來訪問setV4方法。從技術上講,它看起來是正確的,並且工作得很好只是想要使用這個的一些邏輯反饋。 – user3280587