Java Socks 代理套接字错误

Posted

技术标签:

【中文标题】Java Socks 代理套接字错误【英文标题】:Java Socks Proxy Socket Error 【发布时间】:2012-09-29 15:15:22 【问题描述】:

我正在尝试通过 Java 中的 SOCKS (v4 / v5) 代理创建 http 请求。在 WikiPedia 上阅读 socks 通信协议后,我将这段代码放在一起:

Socket sock = new Socket();
InetSocketAddress remoteProxyAddress = new InetSocketAddress(proxy ip, proxy port);
sock.connect(remoteProxyAddress, connTimeout);

InputStream in = sock.getInputStream();
OutputStream out = sock.getOutputStream();

out.write(0x04);
out.write(0x01);
out.write((endpoint.getPort() >> 8) & 0xff);
out.write((endpoint.getPort() >> 0) & 0xff);
out.write(endpoint.getAddress().getAddress());
out.write(0x0);
out.flush();

这里是我从代理服务器读取的部分。问题是响应总是“-1”。

我在 Firefox 上尝试过代理,它运行良好。所以...问题出在我的应用程序中。

谁能帮帮我? 谢谢!

【问题讨论】:

为什么? Java 已经支持 SOCKS 代理。你不必自己写。请参阅 Javadoc/特性/网络指南。 是的...它已经支持 SOCKS,但它在整个 VM 上。我需要在不同的代理服务器上同时建立多个连接。 【参考方案1】:

你不觉得你连接的服务器只支持 Socks v5 协议吗?

您的连接请求一切正常。如果服务器启用了 v4,您的代码应该可以正常工作。我使用非常相似的实现绝对成功。

您还应该看看这个Socket() 构造函数——它可能足以满足您的需要。它存在于 JRE 1.6 和 JRE 1.7 中

【讨论】:

这真的很奇怪。你试过 Sun 的实施吗? 您能检查一下代码开头的endpoint.getPort() 和endpoint.getAddress().getAddress() 的实际值吗? 还有一件事。 endpoint.getAddress().getAddress() 是否返回 ipv4 地址? 我用数据包嗅探器检查了输出。在实际 http 请求之前发送的所有数据都是相同的(我的意思是在我的应用程序和 Firefox 之间)。 @IonutUngureanu 服务器的响应如何?

以上是关于Java Socks 代理套接字错误的主要内容,如果未能解决你的问题,请参考以下文章

通过 socks 代理的 SSL 套接字 - 客户端 <---> 服务器数据是不是加密?

带有 Socks4 代理的 Java Socket 更改为 Socks5

Android,错误套接字异常 (SOCKS)

设置 SOCKS 代理配置后 CFStream 崩溃

SOCKS和socket有啥关系?

jdbc数据库连接失败 java.net.SocketException: Malformed reply from SOCKS