这是我的代码,但我总是收到 java.net.SocketException: SOCKS : 身份验证失败。事实上,我已经用socks5客户端测试了凭据,它们没问题。有件事让我烦恼,只有一个可能的值 Proxy.Type.SOCKS ,这对 SOCKS4 和 SOCKS5 没有区别,那么 okhttp 实际上支持 SOCKS5 代理吗?
String proxyHost="replace with host";
int proxyPort=replace with proxy port;
String username="replace with username";
String password="replace with password";
String url="https://api64.ipify.org?format=json";
Proxy proxyTest = new Proxy(Proxy.Type.SOCKS,new InetSocketAddress(proxyHost, proxyPort));
okhttp3.Authenticator proxyAuthenticator = new okhttp3.Authenticator() {
@Nullable
@Override
public Request authenticate(@Nullable Route route, @NonNull Response response) throws IOException {
String credential = Credentials.basic(username, password);
return response.request().newBuilder()
.header("Proxy-Authorization", credential)
.build();
}
};
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.proxy(proxyTest).proxyAuthenticator(proxyAuthenticator).build();
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
您遇到的异常(java.net.SocketException:SOCKS:身份验证失败)表示 SOCKS 代理身份验证存在问题。以下是一些需要检查的事项和可能的解决方案:
检查代理凭证:
确保使用 SOCKS 代理所需的实际凭据正确设置用户名和密码变量。 验证代理主机和端口:
确保 proxyHost 和 proxyPort 变量设置为 SOCKS 代理的正确值。 更新代理类型:
根据您的代理类型,您可能需要尝试使用 Proxy.Type.HTTP 而不是 Proxy.Type.SOCKS,反之亦然,具体取决于您的代理服务器支持的类型。 调试代理身份验证:
打印出代理凭据以进行调试并检查它们是否设置正确:
System.out.println("Proxy Username: " + username);
System.out.println("Proxy Password: " + password);
在代码之外测试代理身份验证:
尝试将相同的代理凭据与支持 SOCKS 代理身份验证的工具或命令行实用程序一起使用,以确保凭据有效。 检查代理服务器配置:
验证您的 SOCKS 代理服务器是否配置为允许指定的用户名和密码。某些 SOCKS 代理可能需要额外配置才能启用身份验证。
代码的修改版本,带有更多可疑之处
// ... (your previous code)
Proxy proxyTest = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyHost, proxyPort));
okhttp3.Authenticator proxyAuthenticator = new okhttp3.Authenticator() {
@Nullable
@Override
public Request authenticate(@Nullable Route route, @NonNull Response response) throws IOException {
String credential = Credentials.basic(username, password);
System.out.println("Proxy-Authorization: " + credential);
return response.request().newBuilder()
.header("Proxy-Authorization", credential)
.build();
}
};
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.proxy(proxyTest)
.proxyAuthenticator(proxyAuthenticator)
.build();
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();