2016-09-24 77 views
10

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

A.什么是“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 

回答

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。尝试解析主机名失败会增加执行时间。

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

相关问题