原文: 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方法,它重写该方法的处理策略是:当系统设置的代理服务器失败时,默认代理选择器将会采用直连的方式连接远程资源,所以当运行上面程序等待了足够长时间时,程序依然可以打印出该远程资源的所有内容。

使用ProxySelector选择代理服务器相关推荐

  1. squid代理服务器详解

    本文出处不祥,好不容易发现,转到空间参考,感谢作者 再次感谢,本文的作者bye2000. Linux下架设代理服务器 作者:bye2000 一.代理服务器概述 1.1什么是代理服务器 在TCP/IP网 ...

  2. 代理服务器 CCProxy6.64,绿色版,带注册码

    FF代理服务器设置: 工具->选项->高级->网络->连接设置->设置->填http代理服务器ip和由CCProxy设置的端口,端口可以在CCProxy的设置上看到 ...

  3. 选择ip代理软件要看那几点?

    信息化时代,互联网是获取信息的主要方式之一,所以很多商家通过互联网展示自己的品牌和产品,但大多数平台都有限制,不允许大量的广告信息发布,需要切换多个账号发布,或者更换ip工具,如此,找什么样的ip代理 ...

  4. 选择换IP软件安全吗?

    很多网友对此都有疑问,假如你对网络要求很高,处理的资料很重要那么尽可能不可以选择换IP软件,倘若一定要选择一定要使用正规途径,通过安全检测的代理服务器,只有这样才可以相对的保障你的网络信息安全.倘若懂 ...

  5. 安全环境中的WebSphere代理服务器路由功能

    为了以优化的成本提供足够的性能,大量的网站通常依赖使内容更接近客户端的机制. 这通常意味着某种缓存和缓存管理. 尽管必须不要低估由静态内容引起的负载,但对于大多数情况而言,仅缓存静态内容已不再足够. ...

  6. 代理服务器(Proxy)完全解析

    代理服务器(Proxy)完全解析 相信,提起代理服务器(Proxy)还是有非常多的人关注的,因为无论是在线论坛(bbs)或者是新闻组里面,作为一个撰稿人,我的信箱里也经常收到询问代理服务器为何物,或者 ...

  7. 超详细讲解代理服务器的使用方法(多图)

    http://www.enet.com.cn/article/2010/0422/A20100422643199_3.shtml 本文详细讲解了代理服务器的类型.作用和设置方法等.第一页是代理服务器的 ...

  8. 虚假ip链接服务器_使用代理服务器进行虚假相信

    虚假ip链接服务器 by Sumit Gupta 由Sumit Gupta 使用代理服务器进行虚假相信 (Playing make-believe using a proxy server) 使用代理 ...

  9. 腾讯云搭建多IP代理服务器实现游戏单窗口单IP完美搭建Socks5教程附带工具

    目录 腾讯云多IP 配合代理工具实现下图的功能 单窗口单IP 1.多IP服务器选择 2.服务器 3.创建弹性网卡,绑定弹性公网IP 实现多IP 4.如何更换IP 5.服务器网卡绑定内网IP 6.使用C ...

最新文章

  1. python 桑基图 地理坐标_【转载】Python数据可视化-实现Sankey桑基图
  2. TurboMail荣获2010年度优秀电子邮件产品殊荣
  3. SQL 除去数字中多于的0
  4. 15.profile-api
  5. discuz x2.5插件开发傻瓜图文教程,用demo说话
  6. android 获取通讯录全选反选_Xamarin.Forms读取并展示Android和iOS通讯录 TerminalMACS客户端...
  7. gatewayproperties 是空_杨丞琳演唱会踩空,从二楼高台掉到一楼,手脚擦伤,引发网友热议...
  8. 前端框架你究竟选什么
  9. 安装pkgconfig_一个R包怎么也安装不上,憋着急!
  10. 为什么大部分的程序员成不了架构师?为什么?
  11. axios 跨域传参_axios跨域问题
  12. css 背景图 左右空白,缩小窗口时CSS背景图出现右侧空白BUG的解决方法
  13. matlab2012b破解版安装
  14. html画圆中有个正方形,Adobe Illustrator CS6中绘画圆形及正方形的操作使用方法
  15. linux上电自动开启wifi脚本,archlinux 开机自动连接wifi
  16. SeetaFace开源人脸识别引擎
  17. 【历史上的今天】9 月 17 日:世界上的第一张火车票;GamerDNA 创始人出生;中国开设第一个网上多媒体讲座
  18. 用 matplotlib 做交互式的票房分析
  19. 网文IP风向之变 | 一点财经
  20. 中倍健未来数智药房首获红杉基金1千万美元天使轮融资

热门文章

  1. 【Angular】ng-zorro-ant表格切换pageSize页数选择器不生效解决方案
  2. C++ map操作下标问题
  3. D19-Acwing-实现DP第三节相关代码课程完结撒花~
  4. 数值计算大作业:非线性方程求根(二分法、牛顿法、弦截法在Matlab实现)
  5. oppo小布机器人_腾讯宠粉狂欢季丨OPPO手机、腾讯听听音箱、小布AI机器人……100+份豪礼免费送!...
  6. PS制作一寸照片具体过程
  7. 超级玛丽游戏设计(Java+GUI+J2SE)
  8. c语言控制51单片机完成交通信号灯(红绿灯)
  9. Cloud Paks地理数据研究成果|IBM
  10. 帝国php被注入,帝国CMS(EmpireCMS) v7.5 代码注入分析(CVE-2018-19462)