【问题标题】:Java - using Socket with ProxyJava - 使用带有代理的 Socket
【发布时间】:2013-03-15 12:27:45
【问题描述】:

我正在使用套接字通过 HTTP 连接到网站和 API(我知道,使用 URL 类可以更轻松地完成此操作,但我有一些理由选择这种方式)。

现在我想实现隐私功能,因此所有连接都应该通过代理重定向。但我在这样做时遇到了问题。

出于测试目的,我从Free Proxy List 网站寻找并选择了一个免费代理。我为我的测试例程选择了一个正常运行时间较长的设备,但到目前为止还没有成功。

我的源代码:

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())) 的最后一行你的代码在我的机器上运行
  • 您是否通过在浏览器中设置代理来检查代理是否正常工作?
  • 代理使用 Apache HttpComponents 工作。 @OmarMEBARKI 我试过了,但我仍然遇到同样的错误 - 我必须等待 5 分钟然后收到一个 SocketException。我的完整代码:paste.ubuntu.com/5616412你能发布你的完整代码和你的输出吗?
  • 对不起,实际上它不起作用。它不能工作,因为套接字只需要一个 IP 地址。但是一个 URL 可以有 IP + 文件名 ...
  • 8080 将是 HTTP 代理,而不是 SOCKS 代理,如第一个例外所示。

标签: java sockets networking proxy


【解决方案1】:

在 Java 8 之前,原始 TCP 套接字 连接只能通过 SOCKS 代理工作 - 这就是您获得 IllegalArgumentException - Invalid Proxy 的原因。只有在 Java 8 中才添加了通过 HTTP 代理的原始套接字连接。

【讨论】:

    【解决方案2】:

    我认为你需要摆脱这条线:

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

    并改变这一行:

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

    到:

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

    因为您不能将代理指定为“InetSocketAddress”。这是两个不同的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      相关资源
      最近更新 更多