在Java中,使用proxy是通过设置java环境变量来实现的,也就是JVM的系统属性。
我们需要设置三个属性,proxySetproxyHost和proxyPort。
proxySet是个boolean类型的,可以设置为true或者false,true代表使用代理服务器。
proxyHost是代理服务器的IP地址
proxyPort是代理服务器的端口地址。
我们有两种方法设置这种系统属性,
一种是命令行下运行Java程序的时候,通过参数付值
我们需要设置三个属性,proxySetproxyHost和proxyPort。
proxySet是个boolean类型的,可以设置为true或者false,true代表使用代理服务器。
proxyHost是代理服务器的IP地址
proxyPort是代理服务器的端口地址。
我们有两种方法设置这种系统属性,
一种是命令行下运行Java程序的时候,通过参数付值
一种是在java源程序中设置。
第一种方法的格式如下:
java-DproxySet=true-DproxyHost=myProxyServere-DproxyPort=80MyJavaApp
第二种方法,就是直接在源程序中通过系统属性来写,如下:
importjava.util.Properties;
...
...
strProxy="221.15.5.67";
第一种方法的格式如下:
java-DproxySet=true-DproxyHost=myProxyServere-DproxyPort=80MyJavaApp
第二种方法,就是直接在源程序中通过系统属性来写,如下:
importjava.util.Properties;
...
...
strProxy="221.15.5.67";
strPort="8080";
Properties;
systemProperties.setProperty;
systemProperties.setProperty;
JDK1.3以上版本,只要设置了proxyHost和proxyPort就不用写proxySet了。
下面是一个完整的例子:
strUrl="blog.csdn/cqq/";
URLurl=newURL;
URLConnectionconn=url.openConnection;
Properties;
systemProperties.setProperty;
systemProperties.setProperty;
JDK1.3以上版本,只要设置了proxyHost和proxyPort就不用写proxySet了。
下面是一个完整的例子:
strUrl="blog.csdn/cqq/";
URLurl=newURL;
URLConnectionconn=url.openConnection;
strProxy="221.15.5.67";
strPort="8080";
Properties;
systemProperties.setProperty;
systemProperties.setProperty;
BufferedReaderrd=newBufferedReader));
while)!=null)
rd.close;
strPort="8080";
Properties;
systemProperties.setProperty;
systemProperties.setProperty;
BufferedReaderrd=newBufferedReader));
while)!=null)
rd.close;
17.5.2 使用ProxySelector选择代理服务器
前面介绍的直接使用Proxy对象可以在打开URLConnection或Socket时指定代理服务器,使
用这种方式需要每次打开连接都显式设置代理服务器。如果想让系统打开连接时总是具有默认的代理服务器,则可以使用java.ProxySelector,它可以它根据不同的连接使用不同的代理服务器。
系统默认的ProxySelector会检测各种系统属性和URL协议,然后决定怎样连接不同的主机。当然,程序也可以调用ProxySelector类的setDefaultI()静态方法来设置默认代理服务器,也可以调用getDefault()方法获得系统当前默认的代理服务器。
程序可以通过System类来设置系统的代理服务器属性,关于代理服务器常用的属性名有如下三个:
http.proxyHost:设置HTTP访问所使用的代理服务器地址。该属性名的前缀可以改为https、ftp等,分别用于设置HTTP访问、安全HTTP访问和FTP访问所用的代理服务器地址。
http.proxyPort:设置HTTP访问所使用的代理服务器端口。该属性名的前缀可以改为https、ftp等,分别用于设置HTTP访问、安全HTTP访问和FTP访问所用的代理服务器端口。
ProxyHosts:设置HTTP访问中不需要使用代理服务器的远程主机,可以使用*通配
符,如果有多个地址,多个地址用竖线(|)分隔。
下面程序示范了通过改变系统属性来改变默认的代理服务器。
程序清单:codes/17/17-5/ ProxySelectorTest.java
public class ProxySelectorTest { //测试本地JVM的网络默认配置 public void setLocalProxy() { Properties prop = Properties(); //设置HTTP访问要使用的代理服务器的地址 prop.setProperty("http.proxyHost", "10.10.0.96"); //设置HTTP访问要使用的代理服务器的端口 prop.setProperty("http.proxyPort", "8080"); //设置HTTP访问不需要通过代理服务器访问的主机, //可以使用*通配符,多个地址用|分隔 prop.setProperty("ProxyHosts", "localhost|10.20.*"); //设置安全HTTP访问使用的代理服务器地址与端口 //它没有ProxyHosts属性,它按照ProxyHosts 中设置的规则访问 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("", "localhost|10.10.*"); //设置socks代理服务器的地址与端口 prop.setProperty("socks.ProxyHost", "10.10.0.96"); prop.setProperty("socks.ProxyPort", "1080"); } //清除proxy设置 public void removeLocalProxy() { Properties prop = Properties(); //清除HTTP访问的代理服务器设置 ve("http.proxyHost"); java环境变量自动配置ve("http.proxyPort"); ve("ProxyHosts"); //清除HTTPS访问的代理服务器设置 ve("https.proxyHost"); ve("https.proxyPort"); //清除FTP访问的代理服务器设置 ve("ftp.proxyHost"); ve("ftp.proxyPort"); ve(""); //清除SOCKS的代理服务器设置 ve("socksProxyHost"); ve("socksProxyPort"); } //测试HTTP访问 public void showHttpProxy() throws MalformedURLException , IOException { URL url = new URL("du"); //直接打开连接,但系统会调用刚设置的HTTP代理服务器 URLConnection conn = url.openConnection(); //① Scanner scan = new InputStream()); //读取远程主机的内容 while(scan.hasNextLine()) { System.out.Line()); } } public static void main(String[] args)throws IOException { ProxySelectorTest test = new ProxySelectorTest(); test.setLocalProxy(); test.showHttpProxy(); veLocalProxy(); } } |
上面程序中三行粗体字代码设置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方法,它重写该方法的处理策略是:当系统设置的代理服务器失败时,默认代理选择器将会采用直连的方式连接远程资源,所以当运行上面程序等待了足够长时间时,程序依然可以打印出该远程资源的所有内容。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论