Normal view

There are new articles available, click to refresh the page.
Yesterday — 10 January 2025Main stream

检测 socks 代理报错: Cannot invoke " Java .net.InetAddress.getHostName()" because "remote" is null

By: Mrdawu
10 January 2025 at 17:16
Mrdawu:

/** * 使用指定代理测试连接并返回代理的外网 IP * * @param url 测试 URL * @param proxyType 代理类型( HTTP 或 SOCKS ) * @param gateIp 代理 IP * @param gatePort 代理端口 * @param username 代理用户名(可为 null ) * @param password 代理密码(可为 null ) * @return 代理的外网 IP 地址 * @throws IOException IO 异常 */ public static String testProxy(String url, ProxyType proxyType, String gateIp, int gatePort, String username, String password) throws IOException { Proxy proxy = new Proxy( proxyType == ProxyType.SOCKS ? Proxy.Type.SOCKS : Proxy.Type.HTTP, new InetSocketAddress(gateIp, gatePort) );

    if (proxyType == ProxyType.SOCKS) {
        Authenticator.setDefault(new Authenticator() {
            private final PasswordAuthentication authentication = new PasswordAuthentication(
                    username, password.toCharArray());

            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return authentication;
            }
        });
    }

    OkHttpClient.Builder clientBuilder = new OkHttpClient().newBuilder().proxy(proxy);

    if (proxyType == ProxyType.HTTP && username != null && password != null) {
        clientBuilder.proxyAuthenticator((route, response) -> {
            String credential = Credentials.basic(username, password);
            return response.request().newBuilder()
                    .header("Proxy-Authorization", credential)
                    .build();
        });
    }
    clientBuilder.connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS);
    OkHttpClient client = clientBuilder.build();

    Request request = new Request.Builder().url(url).build();
    try (Response response = client.newCall(request).execute()) {
        if (response.body() != null) {
            String responseBody = response.body().string();
            JSONObject jsonObject = JSON.parseObject(responseBody);
            return jsonObject.getString("origin");
        } else {
            throw new IOException("响应体为空");
        }
    }
}

有没有大佬帮忙看下是为啥,本地运行正常,但是部署服务器就会报错 Cannot invoke "java.net.InetAddress.getHostName()" because "remote" is null
❌
❌