Что такое 'proxy.mycompany1.local'

Я только начал работать в сетевых протоколах Java. Я пытаюсь подключиться к Интернету с помощью моего прокси-сервера. Когда я вижу сообщение в https://www.tutorialspoint.com/javaexamples/net_poxy.htm, они устанавливают для свойства http.proxyHost значение "proxy.mycompany1.local". Я знаю, что могу установить это на свой IP-адрес прокси-сервера, но мне любопытно узнать, почему моя программа все еще работает, хотя я установил ее в некоторую случайную строку, такую ​​как "abcd".

а. Что означает "proxy.mycompany1.local"?

В. Как работает моя программа, хотя я установил http.proxyHost "в" abcd "?

Ниже приводится моя рабочая программа:

import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.net.URL;

public class TestProxy {
    public static void main(String s[]) throws Exception {
        try {

            System.setProperty("http.proxyHost", "abcd");
            System.setProperty("http.proxyPort", "8080");

            URL u = new URL("http://www.google.com");
            HttpURLConnection con = (HttpURLConnection) u.openConnection();
            System.out.println(con.getResponseCode() + " : " + con.getResponseMessage());

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(false);
        }
        Proxy proxy = (Proxy) ProxySelector.getDefault().select(new URI("http://www.google.com")).iterator().next();
        System.out.println("proxy Type : " + proxy.type());
        InetSocketAddress addr = (InetSocketAddress) proxy.address();
        if (addr == null) {
            System.out.println("No Proxy");
        } else {
            System.out.println("proxy hostname : " + addr.getHostName());
            System.out.println("proxy port : " + addr.getPort());
        }
    }
}

Это вывод:

200 : OK
proxy Type : HTTP
proxy hostname : abcd
proxy port : 8080

Ответ 1

Прежде всего, в соответствии с "Руководство по свойствам системы" .

Предупреждение. Изменение системных свойств потенциально опасно и следует делать с усмотрением. Многие свойства системы не перечитываются после запуска и находятся в информационных целях. Изменение некоторых свойства могут иметь неожиданные побочные эффекты.

И мой опыт говорит, что при изменении свойств *.proxyHost у вас могут возникнуть неприятные проблемы в вашей системе. Поэтому я не рекомендую вам изменять системные свойства для этой задачи.

Намного лучше использовать что-то вроде:

//Proxy instance, proxy ip = 127.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);

и авторизация на прокси:

Authenticator authenticator = new Authenticator() {
        @Override
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("user",
                    "mypassword".toCharArray());
        }
    };
    Authenticator.setDefault(authenticator);

Теперь вернитесь к основным вопросам:

A. "proxy.mycompany1.local" - это просто пример. Вы можете использовать любое имя хоста

B. Ключ класса использует класс java.net.PlainSocketImpl через Socket. Он пытается разрешить прокси-имя хоста 'abcd', усвоить ошибку и перейти прямо в google. Просто попробуйте сыграть с этим кодом:

import java.net.*;
import java.io.*;

public class RequestURI {

    public static void main(String[] args) {
        int port = 8181;
        long startTime = System.currentTimeMillis();
        try {
//            System.getProperties().setProperty("http.proxyHost", "abcd");
//            System.getProperties().setProperty("http.proxyPort", Integer.toString(port));

            URL url = new URL("http://google.com");
            HttpURLConnection uc = (HttpURLConnection) url.openConnection();
            int resp = uc.getResponseCode();
            if (resp != 200) {
                throw new RuntimeException("Failed: Fragment is being passed as part of the RequestURI");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Run time in ms ="+ (System.currentTimeMillis() - startTime));
    }
}

Вы можете видеть, что время запуска больше, когда вы раскомментируете раздел с setProperty. Неудачная попытка разрешить имя хоста увеличивает время выполнения.

Ответ 2

Прежде всего, proxy.mycompany1.local - это просто имя хоста, это образец, ничего особенного.

Я пробовал ваш код в не проксированной сети, и он работал, как вы описали. Я полагаю, что метод url.openConnection() игнорирует настройки прокси-сервера, потому что если вы управляете своим собственным прокси-сервером и используете url.openConnection(proxy), то он не работает с java.net.UnknownHostException.

Здесь вы видите фрагмент кода:

SocketAddress addr = new InetSocketAddress("abcd", 8080);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
URL url = new URL("http://google.com");
URLConnection conn = url.openConnection(proxy);
InputStream in = conn.getInputStream();
in.close();

Вы можете узнать больше о Java Networking and Proxies.