在前面的HTTP網絡通信的例子中,使用了URLConnection conn = url.openConnection();連接網絡,
如果改用URLConnection conn = url.openConnection(proxy);方式,傳入一個proxy對象,設置好代理IP和端口,則可以實現代理連接,
下面是一個簡單例子,
1 package proxy; 2 3 import java.io.IOException; 4 import java.io.PrintStream; 5 import java.net.InetSocketAddress; 6 import java.net.MalformedURLException; 7 import java.net.Proxy; 8 import java.net.URL; 9 import java.net.URLConnection; 10 import java.util.Scanner; 11 12 public class ProxyTest { 13 final String PROXY_ADDR = "172.20.230.5"; 14 final int PROXY_PORT = 3128; 15 String urlStr = "http://www.baidu.com"; 16 //String urlStr = "http://www.crazyit.org"; 17 18 public void init() throws IOException { 19 URL url = new URL(urlStr); 20 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_ADDR, PROXY_PORT)); 21 //使用代理服務器打開鏈接 22 URLConnection conn = url.openConnection(proxy); 23 //URLConnection conn = url.openConnection(); 24 conn.setConnectTimeout(5000); 25 try { 26 Scanner scan = new Scanner(conn.getInputStream()); 27 PrintStream ps = new PrintStream("index.html"); 28 while (scan.hasNextLine()) { 29 String line = scan.nextLine(); 30 System.out.println(line); 31 ps.println(line); 32 } 33 } catch (IOException e) { 34 e.printStackTrace(); 35 } 36 } 37 38 public static void main(String[] args) throws IOException { 39 new ProxyTest().init(); 40 } 41 }
實現自動代理
在上面的例子中,每次用url對象open一個connection的時候,都需要顯示地傳入一個proxy對象才行。
而實際上可以在connection之前,做一個默認代理設置,這樣以后再openConnection的時候,就不需要顯示傳入proxy對象了。
做默認代理設置需要重寫ProxySelector的select方法,返回代理IP和端口列表,具體實現如下,
1 package proxy; 2 3 import java.io.IOException; 4 import java.io.PrintStream; 5 import java.net.InetSocketAddress; 6 import java.net.MalformedURLException; 7 import java.net.Proxy; 8 import java.net.ProxySelector; 9 import java.net.SocketAddress; 10 import java.net.URI; 11 import java.net.URL; 12 import java.net.URLConnection; 13 import java.util.ArrayList; 14 import java.util.List; 15 import java.util.Scanner; 16 17 public class ProxyTest { 18 final String PROXY_ADDR = "172.20.230.5"; 19 final int PROXY_PORT = 3128; 20 String urlStr = "http://www.baidu.com"; 21 //String urlStr = "http://www.crazyit.org"; 22 23 public void init() throws IOException { 24 ProxySelector.setDefault(new ProxySelector(){ 25 26 @Override 27 public void connectFailed(URI arg0, SocketAddress arg1, 28 IOException arg2) { 29 System.out.println("無法連接到服務器"); 30 31 } 32 33 @Override 34 public List<Proxy> select(URI uri) { 35 List<Proxy> result = new ArrayList<>(); 36 result.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_ADDR, PROXY_PORT))); 37 return result; 38 } 39 40 }); 41 42 URL url = new URL(urlStr); 43 //使用代理服務器打開鏈接 44 URLConnection conn = url.openConnection(); 45 conn.setConnectTimeout(5000); 46 try { 47 Scanner scan = new Scanner(conn.getInputStream()); 48 PrintStream ps = new PrintStream("index.html"); 49 while (scan.hasNextLine()) { 50 String line = scan.nextLine(); 51 System.out.println(line); 52 ps.println(line); 53 } 54 } catch (IOException e) { 55 e.printStackTrace(); 56 } 57 } 58 59 public static void main(String[] args) throws IOException { 60 new ProxyTest().init(); 61 } 62 }
可以看到使用代理之后,再用url打開鏈接時就能像普通連接那樣url.openConnection();了
