The Proxy 类
Java1.5允许java程序对代理服务器进行更精细的操作。特别的是,你可以对不同的远程主机选择不同的代理服务器。代理本身是由java.net.Proxy 类的实例表示。这里仍然只有三种代理方式,HTTP, SOCKS, 和直接连接(也就是不需要代理),由Proxy.Type 型迭代器中的三个常量表示:
· Proxy.Type.DIRECT
· Proxy.Type.HTTP
· Proxy.Type.SOCKS
除了代理的类型外,其他关于代理重要信息包括它的地址和端口,由SocketAddress 的对象表示。例如,这个代码片段创建了一个代理对象,它表示proxy.example.com 端口80上的一个HTTP代理服务器:
SocketAddress address = new InetSocketAddress("proxy.example.com", 80);
Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
尽管这里仅有三种代理对象,但是对于不同主机上的不同代理服务器,会有许多相同类型的代理。
The ProxySelector 类
每个java1.5的jvm都有一个java.net.ProxySelector 对象。它可以对不同的连接委派合适的代理服务器。默认的ProxySelector 仅仅是检测一下各种系统属性和URL协议,然后决定怎样连接不同的主机。尽管如此,但是你可以安装你自己的ProxySelector 子类来代替默认的选择器(selector),让它基于协议,主机,路径,日期,或其它标准来选择不同的代理。
这个类的关键就是抽象方法select( ) :
public abstract List<Proxy> select(URI uri)
java传一个表示需要被连接的主机的URI 对象给该方法。用类URL生成的这个连接对象通常是这种形式:http://www.example.com/ 或者 ftp://ftp.example.com/pub/files/, 或者其他类似的。对于由Socket类生成的单纯的TCP连接, URI会是这种形式:socket://host:port:,看一个实例,socket://www.example.com:80 。对象ProxySelector 对这种类型的对象会选择合适的代理,然后再以形式List<Proxy> 返回它们。这个类的第二个你必须实现的抽象方法是connectFailed( ):
public void connectFailed(URI uri, SocketAddress address, IOException ex)
这是个反馈方法,它警告程序代理服务器连接不成功。例子7-11表示一个ProxySelector 试图对所有的HTTP连接都使用在proxy.example.com 上的代理服务器,除非这个代理服务器在前面,对某个特殊的URL的连接已经失败了。在这种情况下,它会建议用一个直接连接代替。
Example 7-11. A ProxySelector that remembers what it can connect to
import java.net.*;
import java.util.*;
import java.io.*;
public class LocalProxySelector extends ProxySelector {
private List failed = new ArrayList( );
public List<Proxy> select(URI uri) {
List<Proxy> result = new ArrayList<Proxy>( );
if (failed.contains(uri)
|| "http".equalsIgnoreCase(uri.getScheme( ))) {
result.add(Proxy.NO_PROXY);
}
else {
SocketAddress proxyAddress
= new InetSocketAddress( "proxy.example.com", 8000);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyAddress);
result.add(proxy);
}
return result;
}
public void connectFailed(URI uri, SocketAddress address, IOException ex) {
failed.add(uri);
}
}
我已经说过的,每个运行的jvm都肯定会有一个ProxySelector 。为了改变这个ProxySelector ,我们给静态方法ProxySelector.setDefault( ) 传一个新的选择器,像这样:
ProxySelector selector = new LocalProxySelector( ):
ProxySelector.setDefault(selector);
文章整理:西部数码--专业提供域名注册、虚拟主机服务
从这以后,这个jvm打开的所有连接都会询问这个ProxySelector 该使用哪个合适的代理。正常情况下,你不要在共享环境中使用这段代码。例如,在一个Servlet中,你就不要去改变这个ProxySelector 了,因为对在相同容器中的所有servlet来说,它们的ProxySelector 也都被改变了。
通过GET与服务器端程序进行交互
类URL 使java Applet和application与服务器端程序比如CGIs, servlets, PHP页面,和其他使用GET 方法程序的交互,变得更容易了。(我们将在15章讨论服务器端使用POST 方法会用到URLConnection 类的程序。)所有你需要知道的是程序希望接受名字和值之间采取怎样的连接,生成一个带有查询string的URL,这个string会提供正需要的名字和值。所有的名字和值必须是这样x-www-form-url-encoded—被方法URLEncoder.encode() 编码的,这在前面已经讨论过了。
对一个特定程序的查询string,这里有许多方法来决定它的语法规则。如果你自己已经写过服务器端程序,那么你就已经知道了满足这种程序的名字和值对。如果你已经在自己的服务器上安装了第三方的程序,这个程序的说明文档会告诉你它需要什么样的名字和值对。另一方面,如果你正在与第三方服务器上的程序进行对话,可能就得麻烦多了。你可以总是问在远程服务器上的管理员,让他给你提供怎样和他的站点进行对话的规范说明。尽管如此,即使他们不介意这样做,恐怕也没有谁的工作就是“告诉与我们没有任何关系的黑客,怎样才能进入我们的服务器。”因此,除非你恰巧碰到一个特别热心的或者一个无聊的人,他除了写一封长长的email邮件来告诉你如何进入他们的服务器以外,就没有什么其他事干,否则的话,你不得不做一些逆向工程。
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




