【问题标题】:Why does my SOCKS proxy code throw SocketException: Malformed reply from SOCKS server?为什么我的 SOCKS 代理代码会抛出 SocketException: Malformed reply from SOCKS server?
【发布时间】:2014-11-30 15:51:38
【问题描述】:

为什么我的 SOCKS 代理代码会抛出 SocketException: Malformed reply from SOCKS server?我尝试在 URLConnection 或其他中设置,但这不起作用。唯一有效的东西 - chilkat lib,但它是商业的。那么,例如,我如何通过 ASOCKS 代理发出 http 请求?也许存在一些免费的库?

例如,那个代码:

    SocketAddress addr = new InetSocketAddress(proxy_ip, proxy_port);
    Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr);
    Socket socket = new Socket(proxy);
    InetSocketAddress dest = new InetSocketAddress("google.com", 80);
    try {
        socket.connect(dest);
    } catch (IOException ex) {
        Logger.getLogger(CheckProxy.class.getName()).log(Level.SEVERE, null, ex);
    }

抛出异常:

java.net.SocketException: Malformed reply from SOCKS server
at java.net.SocksSocketImpl.readSocksReply(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at proxychecker.CheckProxy.SocksCheck(CheckProxy.java:86)

第 86 行是“socket.connect(dest);”

【问题讨论】:

  • 有两种方法,它们都有文档记录。
  • 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。
  • 好的。我用了很多方法来解决这个问题。一般来说,我收到异常:“java.net.SocketException:来自 SOCKS 服务器的格式错误的回复”。异常不取决于实现,例如我已经尝试了上一条评论中的代码 - stackoverflow.com/questions/21742103/… .
  • 这基本上是 HTTP call with Socks 4 proxy 的副本。另见this Java bug
  • @prophet 这不是这里的情况。

标签: java http proxy socks


【解决方案1】:

这个bug的解释:bugs.java.com/view_bug.do?bug_id=6964547

您需要使用此代码手动更改 Socket 对象中的模式:

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) {

} 

【讨论】:

    【解决方案2】:
    SocketException: Malformed reply from SOCKS server
    

    这表明您根本没有 SOCKS 代理。可能是 HTTP 代理。

    请注意,您问错了问题。你的代码是正确的,是你的前提是错误的。

    【讨论】:

    • 尝试不同的服务器,我确定它不能仅使用 SOCKS4 的服务器。 SOCKS5 服务器正常运行。实际上,如何告诉 java 我使用的是第四版协议? System.setProperty("socksProxyVersion", "4"); 不工作。感谢帮助。袜子服务器的例子可以在这里建立 - incloak.com/proxy-list .
    • 我在这里看到了这个 fenomen 的描述 - bugs.java.com/view_bug.do?bug_id=6964547。如何启用?
    • @PterPterkovich 您应该发布该信息作为答案。
    • 我有相同的问题(Java 7 和 8)我找到了 SOCKS 代理,它可以工作,并且只有当我在 IE、winows PC 中将其指向为 SOCKS 时才有效)并且当我尝试在在 PROSY 连接中,我收到了来自 SOCKS 服务器的相同格式错误的回复
    • @EJP 如何检查它是 socks4 还是 socks5 代理?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多