使用ProxySelector选择代理服务器

原文: http://www.educity.cn/develop/java/201307151121231393.htm  

(本文对原文稍微做了重新排版,以符合csdn博客的文章格式)


---------------------------------------------------------下面是原文---------------------------------------------------------


疯狂Java讲义:使用ProxySelector选择代理服务器
www.educity.cn 作者:李刚 来源:电子工业出版社 2013年7月15日

  17.5.2 使用ProxySelector选择代理服务器

  前面介绍的直接使用Proxy对象可以在打开URLConnection或Socket时指定代理服务器,使用这种方式需要每次打开连接都显式设置代理服务器。如果想让系统打开连接时总是具有默认的代理服务器,则可以使用java.net.ProxySelector,它可以它根据不同的连接使用不同的代理服务器。
  系统默认的ProxySelector会检测各种系统属性和URL协议,然后决定怎样连接不同的主机。当然,程序也可以调用ProxySelector类的setDefaultI()静态方法来设置默认代理服务器,也可以调用getDefault()方法获得系统当前默认的代理服务器。
  程序可以通过System类来设置系统的代理服务器属性,关于代理服务器常用的属性名有如下三个:
  http.proxyHost:设置HTTP访问所使用的代理服务器地址。该属性名的前缀可以改为https、ftp等,分别用于设置HTTP访问、安全HTTP访问和FTP访问所用的代理服务器地址。
  http.proxyPort:设置HTTP访问所使用的代理服务器端口。该属性名的前缀可以改为https、ftp等,分别用于设置HTTP访问、安全HTTP访问和FTP访问所用的代理服务器端口。
  http.nonProxyHosts:设置HTTP访问中不需要使用代理服务器的远程主机,可以使用*通配符,如果有多个地址,多个地址用竖线(|)分隔。
  下面程序示范了通过改变系统属性来改变默认的代理服务器。
  程序清单:codes/17/17-5/ ProxySelectorTest.java

public class ProxySelectorTest
{
  //测试本地JVM的网络默认配置
  public void setLocalProxy()
  {
	  Properties prop = System.getProperties();
	  //设置HTTP访问要使用的代理服务器的地址
	  prop.setProperty("http.proxyHost", "10.10.0.96");
	  //设置HTTP访问要使用的代理服务器的端口
	  prop.setProperty("http.proxyPort", "8080");
	  //设置HTTP访问不需要通过代理服务器访问的主机,
	  //可以使用*通配符,多个地址用|分隔
	  prop.setProperty("http.nonProxyHosts", "localhost|10.20.*");
	  //设置安全HTTP访问使用的代理服务器地址与端口
	  //它没有https.nonProxyHosts属性,它按照http.nonProxyHosts 中设置的规则访问
	  prop.setProperty("https.proxyHost", "192.168.0.96");
	  prop.setProperty("https.proxyPort", "443");
	  //设置FTP访问的代理服务器的主机、端口以及不需要使用代理服务器的主机
	  prop.setProperty("ftp.proxyHost", "10.10.0.96");
	  prop.setProperty("ftp.proxyPort", "2121");
	  prop.setProperty("ftp.nonProxyHosts", "localhost|10.10.*");
	  //设置socks代理服务器的地址与端口
	  prop.setProperty("socks.ProxyHost", "10.10.0.96");
	  prop.setProperty("socks.ProxyPort", "1080");
  }
  //清除proxy设置
  public void removeLocalProxy()
  {
	  Properties prop = System.getProperties();
	  //清除HTTP访问的代理服务器设置
	  prop.remove("http.proxyHost");
	  prop.remove("http.proxyPort");
	  prop.remove("http.nonProxyHosts");
	  //清除HTTPS访问的代理服务器设置
	  prop.remove("https.proxyHost");
	  prop.remove("https.proxyPort");
	  //清除FTP访问的代理服务器设置
	  prop.remove("ftp.proxyHost");
	  prop.remove("ftp.proxyPort");
	  prop.remove("ftp.nonProxyHosts");
	  //清除SOCKS的代理服务器设置
	  prop.remove("socksProxyHost");
	  prop.remove("socksProxyPort");
  }

  //测试HTTP访问
  public void showHttpProxy() throws MalformedURLException , IOException
  {
	  URL url = new URL("http://www.oneedu.cn");
	  //直接打开连接,但系统会调用刚设置的HTTP代理服务器
	  URLConnection conn = url.openConnection();                             //①
	  Scanner scan = new Scanner(conn.getInputStream());
	  //读取远程主机的内容
	  while(scan.hasNextLine())
	  {
	  	   System.out.println(scan.nextLine());
	  }
  }

  public static void main(String[] args)throws IOException
  {
  	   ProxySelectorTest test = new ProxySelectorTest();
	  test.setLocalProxy();
	  test.showHttpProxy();
	  test.removeLocalProxy();
  }
}


  上面程序中三行粗体字代码设置Java打开HTTP访问时的代理服务器属性,其中前两行代码设置代理服务器的地址和端口,第三行代码设置该代理HTTP访问哪些主机时不需要使用代理服务器。上面程序的①行代码处直接打开一个URLConnection,但系统会为打开该URLConnection时使用代理服务器。
  运行上面程序,将会看到程序长时间等待,因为192.168.0.96通常并不是有效的代理服务器(当然,如果读者运行的机器恰好可以使用地址为192.168.0.96的代理服务器又另当别论)。
  系统提供了默认的ProxySelector子类作为代理选择器,开发者可以实现自己的代理选择器,程序可以通过继承ProxySelector来实现自己的代理选择器。继承ProxySelector需要重写两个方法:
  List<Proxy> select(URI uri):实现该方法让代理选择器根据不同的URI来使用不同的代理服务器,该方法就是代理选择器管理网络连接使用代理服务器的关键。
  connectFailed(URI uri, SocketAddress sa, IOException ioe):当系统通过默认的代理服务器建立连接失败后,代理选择器将会自动调用该方法。通过重写该方法可以对连接代理服务器失败的情形进行处理。
  系统默认的代理服务器选择器也重写了connectFailed方法,它重写该方法的处理策略是:当系统设置的代理服务器失败时,默认代理选择器将会采用直连的方式连接远程资源,所以当运行上面程序等待了足够长时间时,程序依然可以打印出该远程资源的所有内容。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值