【问题标题】:HTTP call with Socks proxy使用 Socks 代理的 HTTP 调用
【发布时间】:2014-02-06 17:01:49
【问题描述】:

我想使用 socks 代理访问服务器。但有些事情是不对的。我有一个代理,代理的所有者声称它是一个 socks 代理。

我简化了我的问题,现在尝试使用以下代码访问 google.com。

 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();  

无法与谷歌建立连接。但是,如果我使用 PROXY 类型作为 HTTP,那么它可以工作,即如果我将上述代码的第 4 行替换为

Proxy proxy = new Proxy(Proxy.Type.HTTP, proxySocketAddress1);  

我尝试使用浏览器 (chrome) 访问 google.com,并指定与“socks 代理”和“http 代理”相同的代理,然后能够打开 google。

不确定给定代理何时在浏览器中用作 SOCKS 代理,那么为什么它在代码中不起作用?

如果我得到这个工作,那么最终我想做一些类似的事情:

SocketAddress socketAddress =  new InetSocketAddress(proxyHostname,proxyPort);  
Proxy socketProxy =  new Proxy(Proxy.Type.SOCKS, socketAddress);  
socket = new Socket(socketProxy);  

InetSocketAddress socketAddress = new InetSocketAddress(hostIP,hostPort);    
socket.connect(socketAddress,100000);  

有什么建议可以试试?

【问题讨论】:

    标签: sockets proxy socks


    【解决方案1】:

    我猜这个代理不是socks代理而是HTTP代理,因为

    • 如果您将它用作 http 代理,它可以工作,它不能用作 socks 代理
    • 如果您在 google 中将其指定为 http 和 socks 代理,它可能只会对其他协议(https、ftp..)使用 socks 代理设置,并为 http 使用 http 代理设置 - 所以它也可以作为 http 代理使用
    • 80xx 是 http 代理的典型端口(例如 8000,8001,8080,8081),因为 80 是 http 的“正常”端口,因此 socks 代理通常使用类似 1080 的端口

    【讨论】:

    • 其实它是一个 SOCKS4 代理。当我尝试通过 SOCKS4 连接时,我可以通过代码访问谷歌。
    • 那么奇怪的是java应用程序可以将其用作HTTP代理但不能用作SOCKS代理。也许你应该做一个 tcpdump 看看到底发生了什么。
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    相关资源
    最近更新 更多