JAVA几种代理总结
一 java使用IE代理
(在这之前不能使用过http连接)首先需要设置System.setProperty("java.net.useSystemProxies","true");
如果设置的是Http代理,然后java URLConnection访问会默认走代理。(IQ在使用)
如果设置的是Socks代理,然后new Socket(realIp, realport);访问会自动默认走代理。
二 得到IE浏览器设置的代理ip和端口(ip 和port 在 proxy 返回的address里面 )。
注意,在第一次检测代理之前,一定不能有访问网络的操作,否则检测不到代理(实质就是,在没有访问网络之前System.setProperty("java.net.useSystemProxies","true")设置才生效)
private static Proxy detectProxy(String proxyTypeUrl) throws URISyntaxException{
// Must first set useSystemProxies to true. if not,cann't detect proxy.
System.setProperty("java.net.useSystemProxies", "true");
List<Proxy>proxyList = null;
proxyList =ProxySelector.getDefault().select(new URI(proxyTypeUrl));
for (int j = 0; j <proxyList.size(); j++) {
Proxy proxy =proxyList.get(j);
if (proxy.type() !=Proxy.Type.DIRECT) {
return proxy;
}
}
return null;
}
使用Example:
三,根据已经知道的proxyip和proxyport使用代理
①Http方式访问的代理使用
方法一(只支持http,https,ftp代理) 直接设置属性就可以走代理,属性在初始化代理时设置好就行. 注意这种代理时全局的,设置以后全部会自动走代理,如果需要单个请求走代理(在走代理失败的话,会自动尝试本地直接访问),请使用方法二代理.
// http协力代理属性设置
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", "proxyIp");
System.setProperty("http.proxyPort", "proxyPort");
// https协力代理属性设置
System.setProperty("https.proxyHost", "proxyIp");
System.setProperty("https.proxyPort", "proxyPort");
//ftp协议属性设置
System.setProperty("ftp.proxyHost", "proxyIp");
System.setProperty("ftp.proxyPort", "proxyPort");
// ftp 不走代理主机设置
System.setProperty("ftp.nonProxyHosts", "localhost|192.168.0.*");
根据自己需要的代理种类,设置好属性以后,如果访问URLConnection就可以自动走代理。
//直接访问目的地址,自动会走代理
URL url = newURL("http://www.baidu.com");
URLConnection con =url.openConnection();
方法二(支持http代理和socks代理) 通过构建Proxy来走代理,这种代理1.5及以后的jdk才支持,可以对单独的请求设置代理(在走代理失败的话,不会自动尝试本地直接访问).
Proxy proxy= new Proxy(Proxy.Type.HTTP,newInetSocketAddress("proxyip",proxyport)); //根据实际情况,如果设置的是socks代理,使用参数Proxy.Type.SOCKS
URLConnection connection =url.openConnection(proxy);
方法三(支持http代理) 启动运用通过JVM参数走代理, 注意这种代理时全局的,设置以后全部会自动走代理,如果需要单个请求走代理(在走代理失败的话,会自动尝试本地直接访问),请使用方法二代理
-DproxySet=true
-Dhttp.proxyHost=proxyIp
-Dhttp.proxyPort=proxyPort
附:
Http代理如果需要用户名和密码,请先如下设置.
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("userName", "password"
.toCharArray());
}
});
②Socket方式通信的代理使用
方法一(只支持Socks代理),直接设置属性,自动走代理,注意这种代理时全局的,设置以后全部会自动走代理, (在走代理失败的话,不会自动尝试本地直接访问).(IQ在使用)
// 设置sock代理属性
System.setProperty("socksProxySet", "true");
System.setProperty("socksProxyHost", "proxyIp");
System.setProperty("socksProxyPort", "proxyPort");
// 直接访问,自动走代理
socket = new Socket(realIp, realport);
in = newDataInputStream(socket.getInputStream());
out = newDataOutputStream(socket.getOutputStream());
方法二(只支持Http代理)通过协议,单独的Socket设置代理,(在走代理失败的话,不会自动尝试本地直接访问).(IQ在使用)
socket = new Socket(proxyIP, proxyPort);
in = newDataInputStream(socket.getInputStream());
out = newDataOutputStream(socket.getOutputStream());
然后通过 out.write方法向代理服务器发送协议字符串:
BASE64Encoder encoder = new BASE64Encoder();
//"user:password" ————》代理服务器的用户和密码,必须以英文:分开,如果没有可以不设置。并且需要base64编码。
String authKey =encoder.encode("user:password".getBytes());
String protocal = "CONNECT " + "realIP" + ":" + realPort
+ "HTTP/1.1\r\nProxy-Authorization: Basic " + authKey
+ "\r\n\r\n";
out.write(protocal.getBytes());
发送以后,代理服务器和真实主机建立连接,下次发送数据自动走代理。
方法三(只支持Socks代理)通过Proxy构造代理,可为单独的Socket设置代理
Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("socksProxyIp",”pPort”));
Socket socket = new Socket(proxy);
// 连接成功以后就可以自动通过代理通信
socket.connect(new InetSocketAddress("realIp",realPort));
注:上面的代理方式都已做demo初步验证,测试平台win7,jdk1.6
Etnet
David.Chen