2014-02-12 135 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