5

我正在寻找一个支持身份验证的 java socks 代理客户端类,有什么建议吗?java.net.Proxy 不支持身份验证。

编辑:我似乎找不到通过套接字将身份验证数据附加到特定代理主机的方法。Authenticator.setDefault() 只允许一组凭证。

 Authenticator.setDefault(new Authenticator(){
  protected  PasswordAuthentication  getPasswordAuthentication(){
   PasswordAuthentication p=new PasswordAuthentication("xxx", "xxx".toCharArray());
   return p;
  }
 });
 Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("xxx.xx.xxx.xxx", xxx));

   Socket sock = new Socket(proxy);

   sock.connect(new InetSocketAddress(server,xx));
4

2 回答 2

5

Java 通过注册java.net.Authenticator或通过网络属性中记录的首选项支持 Socks 代理配置:

SOCKS 协议支持设置

SOCKS 用户名和密码通过以下方式获取。首先,如果应用程序已经注册了一个 java.net.Authenticator默认实例,那么将使用设置为字符串“SOCKS5”的协议进行查询,并将提示设置为字符串“SOCKS authentication”。如果验证器没有返回用户名/密码或者没有注册验证器,则系统检查用户偏好“ java.net.socks.username”和“ java.net.socks.password”。如果这些首选项不存在,则user.name检查系统属性“”以获取用户名。在这种情况下,不提供密码。

socksProxyHost
socksProxyPort(默认值:1080)
指示 SOCKS 代理服务器的名称和 SOCKS 协议层将使用的端口号。如果指定了 socksProxyHost,那么所有 TCP 套接字都将使用 SOCKS 代理服务器来建立连接或接受一个连接。SOCKS 代理服务器可以是 SOCKS v4 或 v5 服务器,它必须允许未经身份验证的连接。

对于客户端代码示例,您可以在 Stack Overflow 上查看此答案。

编辑:根据评论更新答案

JDK 中支持 SOCKS 的副作用是您的整个 JVM 将通过相同的 SOCKS 代理。所以这可能不适合你。

Authenticator会影响 JVM 中的所有身份验证(HTTP 身份验证、代理身份验证)。再说一次,这可能对你不起作用。

在您的情况下,一个可能的解决方案是使用HttpComponents中的HttpClient (旧版Commons HTTP Client 3.x的继承者)。查看示例,尤其是通过代理的请求代理身份验证示例。

于 2009-10-08T21:02:45.617 回答
0

使用这个 HttpClient(不是 Apache 的),

http://www.innovation.ch/java/HTTPClient/

这只是一个 URL 处理程序,因此您可以使用通常的 HTTPUrlConnection。它支持 SOCKS 和其他代理。

于 2009-10-08T23:33:34.903 回答