您的位置:首页 > 理论基础 > 计算机网络

读书笔记-java网络编程-5URL和URI-代理

2016-07-05 12:02 344 查看

5. 代理

代理的作用:

出于安全原因防止远程主机了解到本地网络配置的秘密细节

为了通过滤出站请求,限制可以浏览的网络。

出于性能考虑,运行多个用户从本地缓存获取同样的一些经常访问的文档,而不是重复从远程主机下载

5.1 系统属性

没看懂

基本操作所要做的就是设置一些系统属性,指示本地代理服务器的地址。

如果使用存储的HTTP代理,则将http.proxyHost设置为代理服务器的域名或IP地址,将http.proxyPort设置为代理服务器端口(默认为80)还有一些方法包括在java代码中调用System.setProperty,或是通过启动时的-d 选项使用。

如果不需要代理,而是直接连接则要把http.nonProxyHost系统属性设置为其主机名或IP地址。

同样使用ftp协议可以通过设置ftp.proxyHost和ftp.proxyPort和ftp.nonProxyHosts属性实现

java不支持任何其他应用层协议,但是如果对所有TCP连接都使用传输层Socks代理,可以使用socksProxyHost和socksProxyPort系统属性。但是这个选项没有提供禁止代理选项。这是一个全有或全无的选择。

5.2 Proxy类

Proxy类提供粒度更细的控制。确切的说,它允许你为不同的远程主机选择不同的代理服务器。

任然只有三种代理:HTTP、SOCKS和直接连接通过,Proxy.Type的三个枚举常量来表示:

Proxy.Type.DIRECT

Proxy.Type.HTTP

Proxy.Type.SOCKS

关于代理的其他重要信息包括地址和端口,用SocketAddress对象表示。

SocketAddress address = new InetSocketAddress("proxy.example.com",80);
Proxy proxy = new Proxy(Proxy.Type.HTTP,address);


上述代码创建了一个Proxy对象,表示一个http代理服务器

5.3 ProxySelector类

每个运行中的虚拟机都有一个java.net.ProxySelector类,用于确定不同连接的代理服务器。

默认的ProxySelector类只检查各种系统属性和URL协议,来决定如何连接到不同的主机。

不过你可以安装自己的ProxySelector子类来代替默认的选择器。用它根据协议、主机、路径、日期时间和其他标准来选择不同的代理。

这个类关键是抽象方法:

public abstract List<Proxy> select(URI uri)


uri表示需要连接的主机。对于Socket类生产的纯TCP连接,URI形式为:socket://host:port。

ProxySelector为这种类型对象选择正确的代理。并返回到一个
List<Proxy>


第二个重要的抽象方法:

public void conectFailed(URI uri,SocketAddress address, IOException ex)


这是一个回调方法,用于警告程序这个代理服务器实际上没有建立连接。

由于每个虚拟机只有一个ProxySelector,因此要改变这个ProxySelector,需要把新的选择器传递给静态方法ProxySelector.setDefault(),此后虚拟机打开的所有连接都像这个ProxySelect询问将要使用的正确代理。不要在共享环境中运行这样的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息