JAVA几种代理总结

来源:互联网 发布:圆谷官方奥特曼数据 编辑:程序博客网 时间:2024/06/07 06:08

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 detectproxy.

            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初步验证,测试平台win7jdk1.6

 

Etnet

David.Chen

1 0