Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
支持身份验证的Java代理客户端类_Java_Proxy_Socks - Fatal编程技术网

支持身份验证的Java代理客户端类

支持身份验证的Java代理客户端类,java,proxy,socks,Java,Proxy,Socks,我正在寻找一个支持身份验证的JavaSocks代理客户端类,有什么建议吗?java.net.Proxy不支持身份验证 编辑: 我似乎找不到通过套接字将身份验证数据附加到特定代理主机的方法。Authenticator.setDefault()只允许一组凭据 Authenticator.setDefault(new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication(){ Passwo

我正在寻找一个支持身份验证的JavaSocks代理客户端类,有什么建议吗?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));

Java通过注册的
Java.net.Authenticator
或通过首选项支持Socks代理配置,如中所述:

SOCKS协议支持设置

SOCKS的用户名和密码是 通过以下方式获得。第一, 如果申请已注册
java.net.Authenticator
default 实例,则将对此进行查询 将协议设置为字符串 “SOCKS5”,提示设置为 字符串“SOCKS身份验证”。如果 验证器不返回 用户名/密码或如果没有 然后注册验证器 系统检查用户偏好 “
java.net.socks.username
”和 “
java.net.socks.password
”。如果这些 首选项不存在,则 已选中系统属性“
user.name
” 输入用户名。在这种情况下,没有 已提供密码

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

对于客户端代码示例,可以检查堆栈溢出

编辑:根据评论更新答案

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

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

在您的情况下,一个可能的解决方案是使用(遗留的继承者)。请查看,尤其是和示例。

使用此HttpClient(而不是Apache的)


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

如果我需要根据不同的代理主机更改身份验证登录名和密码,Authenticator.getPasswordAuthentication()只允许一组凭据。我认为Authenticator适合我,因为我可以使用Authenticator.getRequestHost()为每个主机分配不同的身份验证程序。我需要一个套接字,而不是一个基于http的客户端,所以HttpClient不适合我。