本文目錄一覽:
- 1、Java 中怎樣在程序中設置代理伺服器
- 2、java使用代理訪問網路的幾種方法
- 3、想用java編寫個代理伺服器,求具體一些思路,詳細一些,謝謝
- 4、java HttpClient設置代理的話,用戶名和密碼怎麼設置?
Java 中怎樣在程序中設置代理伺服器
從JDK1.5開始,Java在java.net包下提供了Proxy和ProxySelector兩個類,其中Proxy代表一個代理伺服器,可以在打開URLConnection連接時指定所用的Proxy實例,也可以在創建Socket連接時指定Proxy實例。而ProxySelector代表一個代理選擇器,它提供了對代理伺服器更加靈活的控制,它可以對HTTP、HTTPS、FTP、SOCKS等分別設置,而且還可以設置不需要通過代理伺服器的主機和地址。通過使用ProxySelector可以達到像在Internet Explorer、FireFox等軟體中設置代理伺服器類似的效果。
代理伺服器的功能就是代理網路用戶去取得網路信息。我們使用網路瀏覽器直接連接其他Internet站點取得網路信息時,通常需要發送Request請求來等到響應。代理伺服器是介於瀏覽器和Web伺服器之間的一台伺服器,有了它之後,瀏覽器不是直接到Web伺服器去取得網頁數據而是向代理伺服器發出請求,Request請求會先送到代理伺服器,由代理伺服器來取回瀏覽器所需要的信息並送回給網路瀏覽器。而且,大部分代理伺服器都具有緩衝的功能,就好像一個大的Cache,它有很大的存儲空間,它不斷將新取得的數據儲存到它本機的存儲器上,如果瀏覽器所請求的數據在它本機的存儲器上已經存在而且是最新的,那麼它就不重新從Web伺服器取數據,而直接將存儲器上的數據傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。歸納起來代理伺服器主要提供如下兩個功能:
突破自身IP限制,對外隱藏自身IP地址。突破IP限制包括訪問國外受限站點,訪問國內特定單位、團體的內部資源。
提高訪問速度,代理伺服器提供的緩衝功能可以避免每個用戶都直接訪問遠程主機,從而提高客戶端訪問速度。
17.5.1 直接使用Proxy創建連接
Proxy有如下一個構造器:Proxy(Proxy.Type type, SocketAddress sa):創建表示代理伺服器的Proxy對象。而sa參數指定代理伺服器的地址,其中type是該代理伺服器的類型,該伺服器類型有如下三種:
(1)Proxy.Type.DIRECT:表示直接連接或缺少代理。
(2)Proxy.Type.HTTP:表示高級協議的代理,如 HTTP 或 FTP。
(3)Proxy.Type.SOCKS:表示 SOCKS(V4 或 V5)代理。
一旦創建了Proxy對象之後,程序就可以在使用URLConnection打開連接時,或創建Socket連接時傳入一個Proxy對象,作為本次連接所使用的代理伺服器。
其中URL包含了一個URLConnection openConnection(Proxy proxy)方法,該方法使用指定的代理伺服器來打開連接;而Socket則提供了一個Socket(Proxy proxy)構造器,該構造器使用指定的代理伺服器創建一個沒有連接的Socket對象。
下面以URLConnection為例來介紹如何在URLConnection中使用代理伺服器。
程序清單:codes/17/17-5/ProxyTest.java
上面代碼第一行粗體字代碼創建了一個Proxy對象,第二行粗體字代碼就是用Proxy對象來打開URLConnection連接。除此之外,該程序的其他地方就是對URLConnection的使用了。由此可見, JDK1.5提供了對代理伺服器很好的支持。
17.5.2 使用ProxySelector選擇代理伺服器
前面介紹的直接使用Proxy對象可以在打開URLConnection或Socket時指定代理伺服器,使用這種方式需要每次打開連接都顯式設置代理伺服器。如果想讓系統打開連接時總是具有默認的代理伺服器,則可以使用java.net.ProxySelector,它可以它根據不同的連接使用不同的代理伺服器。
系統默認的ProxySelector會檢測各種系統屬性和URL協議,然後決定怎樣連接不同的主機。當然,程序也可以調用ProxySelector類的setDefaultI()靜態方法來設置默認代理伺服器,也可以調用getDefault()方法獲得系統當前默認的代理伺服器。
程序可以通過System類來設置系統的代理伺服器屬性,關於代理伺服器常用的屬性名有如下三個:
http.proxyHost:設置HTTP訪問所使用的代理伺服器地址。該屬性名的前綴可以改為https、ftp等,分別用於設置HTTP訪問、安全HTTP訪問和FTP訪問所用的代理伺服器地址。
http.proxyPort:設置HTTP訪問所使用的代理伺服器埠。該屬性名的前綴可以改為https、ftp等,分別用於設置HTTP訪問、安全HTTP訪問和FTP訪問所用的代理伺服器埠。
http.nonProxyHosts:設置HTTP訪問中不需要使用代理伺服器的遠程主機,可以使用*通配符,如果有多個地址,多個地址用豎線(|)分隔。
下面程序示範了通過改變系統屬性來改變默認的代理伺服器。
程序清單:codes/17/17-5/ ProxySelectorTest.java
上面程序中三行粗體字代碼設置Java打開HTTP訪問時的代理伺服器屬性,其中前兩行代碼設置代理伺服器的地址和埠,第三行代碼設置該代理HTTP訪問哪些主機時不需要使用代理伺服器。上面程序的①行代碼處直接打開一個URLConnection,但系統會為打開該URLConnection時使用代理伺服器。
運行上面程序,將會看到程序長時間等待,因為192.168.0.96通常並不是有效的代理伺服器(當然,如果讀者運行的機器恰好可以使用地址為192.168.0.96的代理伺服器又另當別論)。
系統提供了默認的ProxySelector子類作為代理選擇器,開發者可以實現自己的代理選擇器,程序可以通過繼承ProxySelector來實現自己的代理選擇器。繼承ProxySelector需要重寫兩個方法:
ListProxy select(URI uri):實現該方法讓代理選擇器根據不同的URI來使用不同的代理伺服器,該方法就是代理選擇器管理網路連接使用代理伺服器的關鍵。
connectFailed(URI uri, SocketAddress sa, IOException ioe):當系統通過默認的代理伺服器建立連接失敗後,代理選擇器將會自動調用該方法。通過重寫該方法可以對連接代理伺服器失敗的情形進行處理。
系統默認的代理伺服器選擇器也重寫了connectFailed方法,它重寫該方法的處理策略是:當系統設置的代理伺服器失敗時,默認代理選擇器將會採用直連的方式連接遠程資源,所以當運行上面程序等待了足夠長時間時,程序依然可以列印出該遠程資源的所有內容。
java使用代理訪問網路的幾種方法
使用Proxy來對每個連接實現代理, 這種方法只能在jdk 1.5以上的版本使用(包含jdk1.5), 優點是可以單獨的設置每個連接的代理, 缺點是設置比較麻煩:
public static void main(String[] args) {
try {
URL url = new URL(“”);
// 創建代理伺服器
InetSocketAddress addr = new InetSocketAddress(“192.168.0.254”,
8080);
// Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // Socket 代理
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); // http 代理
// 如果我們知道代理server的名字, 可以直接使用
// 結束
URLConnection conn = url.openConnection(proxy);
InputStream in = conn.getInputStream();
// InputStream in = url.openStream();
String s = IOUtils.toString(in);
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
不是很詳細, 有什麼問題還望大家指正
想用java編寫個代理伺服器,求具體一些思路,詳細一些,謝謝
在編寫代理伺服器之前,首先應該明白一點,Java的代理機制,如圖所示:
那麼Java就處於中間這層代理伺服器,代理伺服器所作的事情如下:
1、接收客戶端請求,進行處理,然後發送給服務端
2、接收服務端響應,進行處理,然後發送給客戶端
這樣,就更清晰了,Java提供了代理的API為,java.net.Proxy類。此類表示代理設置,通常為類型(http、socks)和套接字地址。Proxy 是不可變對象。
也就是說Java可以製作高級協議的代理,如 HTTP 或 FTP。也可以製作SOCKS(V4 或 V5)代理。
首先,使用到了URL類,HttpURLConnection類及其我們的代理類Proxy類。他們都位於java.net包中。
第一步:生成代理,指定埠為8888:
第二步:使用URLConnection類進行連接
第三步:打開URL,並且讀取HTML源碼
java HttpClient設置代理的話,用戶名和密碼怎麼設置?
使用代理需要導入:commons-logging-1.1.jar,httpclient-4.0-beta2.jar ,httpcore-4.1-alpha1.jar 和 commons-codec-1.4.jar架包。
在連接代理時需要使用用戶名和密碼構造UsernamePasswordCredentials對象並作為參數傳遞給HttpClient對象。
具體用法如下:
public static void main(String args[])
{
StringBuffer sb = new StringBuffer();
//創建HttpClient實例
HttpClient client = getHttpClient();
//創建httpGet
HttpGet httpGet = new HttpGet(“”);
//執行
try {
HttpResponse response = client.execute(httpGet);
HttpEntity entry = response.getEntity();
if(entry != null)
{
InputStreamReader is = new InputStreamReader(entry.getContent());
BufferedReader br = new BufferedReader(is);
String str = null;
while((str = br.readLine()) != null)
{
sb.append(str.trim());
}
br.close();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(sb.toString());
}
//設置代理
public static HttpClient getHttpClient() {
DefaultHttpClient httpClient = new DefaultHttpClient();
String proxyHost = “proxycn2.huawei.com”;
int proxyPort = 8080;
String userName = “china\\******”;
String password = “*******「
httpClient.getCredentialsProvider().setCredentials(
new AuthScope(proxyHost, proxyPort),
new UsernamePasswordCredentials(userName, password));
HttpHost proxy = new HttpHost(proxyHost,proxyPort);
httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy);
return httpClient;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/259379.html