什么是' proxy.mycompany1.local'

时间:2016-09-24 06:12:42

标签: java proxy

我刚开始使用Java网络协议。我正在尝试使用我的代理服务器连接到互联网。当我在' https://www.tutorialspoint.com/javaexamples/net_poxy.htm'上看到帖子时,他们将http.proxyHost属性设置为' proxy.mycompany1.local'。我知道我可以将它设置为我的代理服务器IP,但我很想知道为什么我的程序仍然有效,即使我将它设置为一些随机字符串,例如" abcd"。

一个。什么是' proxy.mycompany1.local"代表什么?

B中。为什么我的程序工作正常,即使我设置了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

2 个答案:

答案 0 :(得分:6)

首先,根据System Properties tutorial

  

警告:更改系统属性可能会造成危险   应该谨慎行事。许多系统属性都不会被重读   在启动后,是出于提供信息的目的。换一些   属性可能会产生意想不到的副作用。

我的经验表明,当您更改*.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. 类URL通过Socket使用java.net.PlainSocketImpl类。它会尝试解析代理主机名'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取消注释部分时,您可以看到运行时间更长。尝试解析主机名失败会增加执行时间。

答案 1 :(得分:3)

首先,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的更多信息。