一、简介
ProxySelector
是一个强大的工具,允许你在Java
中根据特定的规则或策略选择代理服务器。通过实现ProxySelector
接口并设置默认的选择器,你可以灵活地控制网络请求的代理行为。请注意,在使用代理服务器时,要确保代理服务器可用并符合你的网络需求。
二、使用方法
- 创建自定义的
ProxySelector
实现类
创建一个实现类来实现ProxySelector
接口,并重写其中的方法。
ProxySelector
接口中有两个主要方法需要实现:
List<Proxy> select(URL url)
:该方法根据传入的URL对象返回一个代理服务器的列表。可根据URL的信息来判断是否需要使用代理,然后返回相应的代理 服务器列表。如果没有适用的代理,可以返回一个空的列表或者包含Proxy.NO_PROXY
的列表表示直接链接void connectFailed(URL url,SocketAddress sa,IOException ioe)
:在连接代理服务器或目标服务器发生错误时会调用该方法。可处理连接失败的情况:如记录日志,打印错误信息等。
package poc;
import java.io.IOException;
import java.net.*;
import java.util.Collections;
import java.util.List;
public class MyProxySelector extends ProxySelector {
private String proxyHost;
private int proxyPort;
public String getProxyHost() {
return proxyHost;
}
public void setProxyHost(String proxyHost) {
this.proxyHost = proxyHost;
}
public int getProxyPort() {
return proxyPort;
}
public void setProxyPort(int proxyPort) {
this.proxyPort = proxyPort;
}
public MyProxySelector(String proxyHost, int proxyPort) {
this.proxyHost = proxyHost;
this.proxyPort = proxyPort;
}
@Override
public List<Proxy> select(URI uri) {
//创建代理服务器地址对象
InetSocketAddress proxyAddr = new InetSocketAddress(this.proxyHost,this.proxyPort);
//创建代理对象代理对象
Proxy proxy = new Proxy(Proxy.Type.HTTP,proxyAddr);
//返回包含一个代理服务器的列表
return Collections.singletonList(proxy);
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
System.err.println("Failed to connect proxy"+sa);
ioe.printStackTrace();
}
}
- 设置默认的
ProxySelector
一旦创建了自定义的ProxySelector
实现类后,可以将其设置为默认的ProxySelector
,使其在全局范围内生效,通过调用ProxySelector.setDefault()
方法来实现:
ProxySelector.setDefault(new MyProxySelector());
- 使用URLConnection或HttpClient进行网络请求
当你设置了默认的ProxySelector后,在进行网络请求时,Java的标准网络API(如HttpURLConnection或HttpClient)会自动使用设置的ProxySelector来选择代理服务器。你无需做额外的工作,网络请求将会按照你在select()方法中定义的规则进行代理服务器的选择。 - 取消默认的
ProxySelector
设置
可以通过ProxySelector.getDefault()方法获取默认的ProxySelector实例,然后将其设置为null:
ProxySelector.setDefault(null);
三、示例
- 创建实现类
MyProxySelector.java
实现ProxySelector
,
package util;
import java.io.IOException;
import java.net.*;
import java.util.Collections;
import java.util.List;
public class MyProxySelector extends ProxySelector {
private String proxyHost;
private String proxyPort;
public String getProxyHost() {
return proxyHost;
}
public void setProxyHost(String proxyHost) {
this.proxyHost = proxyHost;
}
public String getProxyPort() {
return proxyPort;
}
public void setProxyPort(String proxyPort) {
this.proxyPort = proxyPort;
}
public MyProxySelector(String proxyHost, String proxyPort) {
this.proxyHost = proxyHost;
this.proxyPort = proxyPort;
}
@Override
public List<Proxy> select(URI uri) {
//创建代理服务器地址对象
InetSocketAddress proxyAddr = new InetSocketAddress(this.proxyHost, Integer.parseInt(this.proxyPort));
//创建代理对象代理对象
Proxy proxy = new Proxy(Proxy.Type.HTTP,proxyAddr);
//返回包含一个代理服务器的列表
return Collections.singletonList(proxy);
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
System.err.println("Failed to connect proxy"+sa);
ioe.printStackTrace();
}
}
- 使用
3. 测试