要想让你的java应用使用代理连接网络,有两种方式可以做到。
一、设置System的properties,这种方法的缺点是不能为单独应用设置不同的代理。
二、使用Proxy类,这种方法可以为单独的应用设置单独的代理。
抽象类
package com.rabbit.proxy;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import com.rabbit.util.ConfigReader;
/**
* @author yangfei
* @since 2014-5-4
*/
public abstract class AbstractProxy {
/**
* 代理信息,本地通过配置文件获取
*/
protected static final boolean NEED_PROXY = Boolean.parseBoolean(ConfigReader.getValue("needProxy"));
protected static final String PROXY_URL = ConfigReader.getValue("proxy.host");
protected static final int PROXY_PORT = Integer.valueOf(ConfigReader.getValue("proxy.port"));
protected abstract URLConnection getHttpUrlConnect(URL url) throws IOException;
}
系统代理实现方式
package com.rabbit.proxy;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Properties;
/**
*
* @author yangfei
* @since 2014-5-4
*/
public class SystemProxy extends AbstractProxy {
static {
if (NEED_PROXY) {
Properties prop = System.getProperties();
// 设置http访问要使用的代理服务器的地址
prop.setProperty("http.proxyHost", PROXY_URL);
// 设置http访问要使用的代理服务器的端口
prop.setProperty("http.proxyPort", "" + PROXY_PORT);
}
}
/*
* (non-Javadoc)
*
* @see com.rabbit.proxy.AbstractProxy#getUrlConnect(java.lang.String)
*/
@Override
protected URLConnection getHttpUrlConnect(URL url) throws IOException {
return url.openConnection();
}
}
通过proxy类方式
package com.rabbit.proxy;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
/**
* @since 2014-5-4
*/
public class ConnectProxy extends AbstractProxy {
/* (non-Javadoc)
* @see com.rabbit.proxy.AbstractProxy#getUrlConnect(java.net.URL)
*/
@Override
protected URLConnection getHttpUrlConnect(URL url) throws IOException {
URLConnection conn = null;
if (NEED_PROXY) {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
PROXY_URL, PROXY_PORT));
conn = url.openConnection(proxy);
} else {
conn = url.openConnection();
}
return conn;
}
}
package com.rabbit.proxy;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import com.rabbit.util.ConfigReader;
/**
* @since 2014-5-4
*/
public class URLConnectionFactory {
public static AbstractProxy getProxy() throws MalformedURLException{
String proxyMethod = ConfigReader.getValue("proxyFactory.method");
if("system".equals(proxyMethod)){
return new SystemProxy();
}else{
return new ConnectProxy();
}
}
public static URLConnection getProxyConnection(String url) throws IOException{
AbstractProxy proxy = getProxy();
return proxy.getHttpUrlConnect(new URL(url));
}
}
测试类(读取网络文件)
package com.rabbit.file;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import com.rabbit.proxy.URLConnectionFactory;
import com.rabbit.util.ConfigReader;
/**
* 远程文件工具类
*
* @author yfei
*
*/
public class RemoteFileUtil {
/**
* 通过http协议,获取远程文件
*
* @param netFilePath
* 文件地址
* @param destFilePath
* 目标文件地址
* @throws IOException
* exception
*/
public static void readHttpFile(String netFilePath, String destFilePath)
throws IOException {
HttpURLConnection conn = (HttpURLConnection) URLConnectionFactory.getProxyConnection(netFilePath);
DataInputStream input = new DataInputStream(conn.getInputStream());
DataOutputStream output = new DataOutputStream(new FileOutputStream(
destFilePath));
int len;
byte[] b = new byte[5012];
while ((len = input.read(b)) != -1) {
output.write(b, 0, len);
}
input.close();
output.close();
}
public static void main(String args[]) throws IOException{
readHttpFile("http://www.baidu.com","D:\\test.html");
}
}