Java - 使用代理与Socket通信

3
我正在使用套接字通过HTTP连接到网站和API(我知道,使用URL类可以更轻松地完成这个操作,但我有一些选择这种方式的理由)。
现在我想要实现一个隐私功能,所以所有连接都应该通过代理重定向。但是我在执行此操作时遇到了问题。
为了测试目的,我从免费代理列表网站上选择了一个长时间运行的免费代理。我选择了一个高可用性的代理来进行测试例程,但迄今为止还没有成功。
我的源代码:
URL url = new URL("someurl");
InetSocketAddress address = new InetSocketAddress("202.77.110.22", 8080); 
java.net.Proxy javaProxy = new Proxy(Proxy.Type.SOCKS, address);
Socket server = new Socket(javaProxy);
server.connect(new InetSocketAddress(url.getHost(), url.getPort()));

我希望通过代理“202.77.110.22:8080”连接到URL。如果我在Eclipse中执行代码,我必须等待约五分钟,然后收到以下错误消息:

SocketException: SOCKS服务器返回的消息格式错误

当使用Proxy.Type.HTTP而不是Proxy.Type.SOCKS时,我会收到以下错误消息:

IllegalArgumentException - 无效代理

我知道(Stackoverflow上的)这个问题已经被提出过了,但没有一个答案能够帮助我解决问题。也许我选择了一个不支持的代理?在使用Apache HttpComponents测试时它是可以正常工作的。

非常感谢您的帮助。

除了最后一行,我将其更改为server.connect(new InetSocketAddress(url.getHost(), (url.getPort()==-1)?80:url.getPort()));。你的代码在我的机器上运行正常。 - Omar MEBARKI
你是否通过在浏览器中设置代理来检查它是否有效? - beny23
代理使用Apache HttpComponents。@OmarMEBARKI我尝试了,但我仍然收到相同的错误 - 我必须等待5分钟,然后接收SocketException。我的完整代码:http://paste.ubuntu.com/5616412/ 你能发布你的完整代码和输出吗? - Martin Bories
很抱歉,实际上它无法工作。这是因为套接字只需要一个 IP 地址,但 URL 可能包含 IP 地址和文件名... - Omar MEBARKI
8080将是一个HTTP代理,而不是一个SOCKS代理,这正如第一个异常所示。 - user207421
2个回答

2

在Java 8之前,原始TCP套接字连接只能通过SOCKS代理工作 - 这就是为什么您会得到IllegalArgumentException - Invalid Proxy。直到Java 8才添加了通过HTTP代理连接原始套接字的功能。


-1

我认为你需要删除这一行:

InetSocketAddress address = new InetSocketAddress("202.77.110.22", 8080); 

并更改此行:

java.net.Proxy javaProxy = new Proxy(Proxy.Type.SOCKS, address);

to:

java.net.Proxy javaProxy = new Proxy(Proxy.Type.SOCKS, "202.77.110.22:8080");

因为你不能将代理指定为"InetSocketAddress"。这是两个不同的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接