package org.arong.egdownloader.spider;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.URL;
import java.net.URLConnection;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
/**
* 代理
* @author dipoo
* @since 2016-03-22
*/
public class Proxy {
public static boolean useProxy;
public static java.net.Proxy.Type type = java.net.Proxy.Type.HTTP;//HTTP或者SOCKS
public static String ip;
public static String port;
public static String username;
public static String pwd;
public static void init(boolean useProxy_, String type_, String ip_, String port_, String username_, String pwd_){
useProxy = useProxy_;
ip = ip_;
port = port_;
username = username_;
pwd = pwd_;
if("http".equals(type_)){
type = java.net.Proxy.Type.HTTP;
}
//jdk的socks4代理存在bug
/*else if("socks".equals(type_)){
type = java.net.Proxy.Type.SOCKS;
}*/
//proxy();
}
/**
* jvm全局使用代理
*/
public static void proxy(){
if(useProxy){
System.setProperty("http.maxRedirects", "50");
System.getProperties().setProperty("proxySet", "true");
System.getProperties().setProperty("http.proxyHost", ip);
System.getProperties().setProperty("http.proxyPort", port);
}else{
System.getProperties().setProperty("proxySet", "false");
System.getProperties().setProperty("http.proxyHost", "");
System.getProperties().setProperty("http.proxyPort", "");
}
}
/**
* 取消jvm全局代理
*/
public static void unproxy(){
if(!useProxy){
System.getProperties().setProperty("proxySet", "false");
}
}
public static HttpClient getHttpClient(){
HttpClient httpClient = new HttpClient();
if(useProxy){
//设置代理服务器的ip地址和端口
httpClient.getHostConfiguration().setProxy(ip, Integer.parseInt(port));
//使用抢先认证
httpClient.getParams().setAuthenticationPreemptive(true);
//如果代理需要密码验证,这里设置用户名密码
if(username != null && pwd != null){
httpClient.getState().setProxyCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, pwd));
}
}
return httpClient;
}
public static java.net.Proxy getNetProxy(){
if(useProxy){
return new java.net.Proxy(type, new InetSocketAddress(ip, Integer.parseInt(port)));
}
return null;
}
public static void main(String[] args) throws IOException {
System.setProperty("http.maxRedirects", "50");
System.getProperties().setProperty("proxySet", "true");
// 如果不设置,只要代理IP和代理端口正确,此项不设置也可以
String ip = "127.0.0.1";
/*ip = "221.130.18.5";
ip = "221.130.23.135";
ip = "221.130.18.78";
ip = "221.130.23.134";
ip = "221.130.18.49";
ip = "111.1.32.36";
ip = "221.130.18.49";
ip = "221.130.18.49";*/
System.getProperties().setProperty("http.proxyHost", ip);
System.getProperties().setProperty("http.proxyPort", "22900");
//确定代理是否设置成功
System.out.println(getHtml("http://1212.ip138.com/ic.asp"));
}
private static String getHtml(String address){
StringBuffer html = new StringBuffer();
String result = null;
try{
URL url = new URL(address);
URLConnection conn = url.openConnection();
conn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 7.0; NT 5.1; GTB5; .NET CLR 2.0.50727; CIBA)");
BufferedInputStream in = new BufferedInputStream(conn.getInputStream());
try{
String inputLine;
byte[] buf = new byte[4096];
int bytesRead = 0;
while (bytesRead >= 0) {
inputLine = new String(buf, 0, bytesRead, "ISO-8859-1");
html.append(inputLine);
bytesRead = in.read(buf);
inputLine = null;
}
buf = null;
}finally{
in.close();
conn = null;
url = null;
}
result = new String(html.toString().trim().getBytes("ISO-8859-1"), "gb2312").toLowerCase();
}catch (Exception e) {
e.printStackTrace();
return null;
}finally{
html = null;
}
return result;
}
public boolean isUseProxy() {
return useProxy;
}
}