JAVA基礎知識之網絡編程——-使用Proxy創建連接


在前面的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();了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM