我刚刚开始使用Java网络协议(protocol)。我正在尝试使用代理服务器连接到Internet。当我在“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
最佳答案
首先,根据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
的注释时,可以看到运行时间更长。尝试解析主机名失败,将增加执行时间。关于java - 什么是 'proxy.mycompany1.local',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39673149/