最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的代理原理及代理使用示例

 更新時(shí)間:2015年03月12日 09:37:10   投稿:junjie  
這篇文章主要介紹了Java中的代理原理及代理使用示例,本文講解了Java Socket編程中加入代理的2種方法,需要的朋友可以參考下

今天再測試Socket編程時(shí),無法連接外網(wǎng)。公司用的是Http的代理。上網(wǎng)搜索也沒看太懂,所以花了大量時(shí)間來學(xué)習(xí)??戳薍TTP和TCP協(xié)議的關(guān)系好,才有所明白?,F(xiàn)在能通過Socket使用HTTP代理了,結(jié)果很簡單,過程卻好難。

1. 先簡要說說HTTP和TCP(具體內(nèi)容自行Google,資料很多很全),這里就講講要點(diǎn):

HTTP:是應(yīng)用層協(xié)議,是基于傳輸層協(xié)議的。

TCP: 是傳輸層協(xié)議,是基于網(wǎng)絡(luò)層協(xié)議的。

IP: 是網(wǎng)絡(luò)層協(xié)議。

一個(gè)TCP的連接要進(jìn)行三次握手(就像轉(zhuǎn)戶口一樣,不詳說),HTTP只是一個(gè)應(yīng)用協(xié)議,也就是相當(dāng)于一個(gè)自定義協(xié)議,即其沒有對底層的傳輸方式進(jìn)行干涉,只是對數(shù)據(jù)內(nèi)容格式進(jìn)行了定義。打個(gè)比方,別人說“SB”(你的名字),你回答“是”,僅僅是內(nèi)容格式,沒有改變聲音的傳輸方式(通過聲波傳送<網(wǎng)絡(luò)硬件介質(zhì)>,通過雙方都能聽懂的語言<TCP/IP>)。同理,F(xiàn)TP, Telnet也是一種應(yīng)用層協(xié)議,打個(gè)比方對于FTP,別人說“SB",你回答“哎”,只是格式內(nèi)容不同而已。

2. 認(rèn)識到以上之后,我們再說說HTTP代理,從上可以理解,HTTP代理服務(wù)器就是這樣一臺機(jī)器:你把所有的HTTP請求(不管是想請求百度還是Google)都發(fā)到這個(gè)HTTP代理服務(wù)器,然后這個(gè)HTTP代理服務(wù)器請求你要訪問的最終地址,把響應(yīng)回傳給你。這里還要注意它代理的是HTTP協(xié)議,而HTTP又是基于TCP的,也就是說這個(gè)服務(wù)器代理的是指定HTTP內(nèi)容格式的TCP連接。再說下去也沒意思了,看以下代碼:

復(fù)制代碼 代碼如下:

//以下地址是代理服務(wù)器的地址 
Socket socket = new Socket("10.1.2.188", 80); 
//寫與的內(nèi)容就是遵循HTTP請求協(xié)議格式的內(nèi)容,請求百度 
socket.getOutputStream().write(new String("GET http://www.baidu.com/ HTTP/1.1\r\n\r\n").getBytes()); 
byte[] bs = new byte[1024]; 
InputStream is = socket.getInputStream(); 
int i; 
while ((i = is.read(bs)) > 0) { 
    System.out.println(new String(bs, 0, i)); 

is.close(); 

當(dāng)然在Java中,有Proxy代理上網(wǎng)的使用,此時(shí)使用URL(HTTP)就不涉及Socket(TCP)了,看如下代碼

復(fù)制代碼 代碼如下:

//設(shè)置代理 
System.setProperty("http.proxySet", "true"); 
System.setProperty("http.proxyHost", "10.1.2.188"); 
System.setProperty("http.proxyPort", "80"); 
 
//直接訪問目的地址 
URL url = new URL("http://www.baidu.com"); 
URLConnection con = url.openConnection(); 
InputStreamReader isr = new InputStreamReader(con.getInputStream()); 
char[] cs = new char[1024]; 
int i = 0; 
while ((i = isr.read(cs)) > 0) { 
    System.out.println(new String(cs, 0, i)); 

isr.close(); 

最后總結(jié)一下:

在使用HTTP代理的環(huán)境中,

如果使用Socket(TCP)連接外網(wǎng),則直接連接代理服務(wù)器,然后在發(fā)送的HTTP請求中指明要轉(zhuǎn)發(fā)到的外網(wǎng)網(wǎng)址。

如果使用URL(HTTP)連接外網(wǎng),則需要設(shè)置HTTP代理參數(shù)或使用Proxy。

 

OK,明白以后可以隨意使用了,看以下代碼,使用NIO的Socket通過HTTP代理訪問外網(wǎng)的例子:

復(fù)制代碼 代碼如下:

SocketChannel sc = SocketChannel.open(new InetSocketAddress("10.1.2.188", 80)); 
 
sc.write(Charset.forName("utf8").encode("GET http://www.baidu.com/ HTTP/1.1\r\n\r\n")); 
 
ByteBuffer buffer = ByteBuffer.allocate(1024); 
 
while (sc.read(buffer) != -1) { 
    buffer.flip(); 
    System.out.println(Charset.forName("utf8").decode(buffer)); 
    buffer.clear(); 

sc.close(); 

Java Socket編程中加入代理示例

有些時(shí)候我們的網(wǎng)絡(luò)不能直接連接到外網(wǎng), 需要使用http或是https或是socket代理來連接到外網(wǎng), 這里是java使用代理連接到外網(wǎng)的一些方法,:方法一使用系統(tǒng)屬性來完成代理設(shè)置, 這種方法比較簡單, 但是不能對單獨(dú)的連接來設(shè)置代理:

復(fù)制代碼 代碼如下:

    public static void main(String[] args) {
        Properties prop = System.getProperties();
        // 設(shè)置http訪問要使用的代理服務(wù)器的地址
        prop.setProperty("http.proxyHost", "192.168.0.254");
        // 設(shè)置http訪問要使用的代理服務(wù)器的端口
        prop.setProperty("http.proxyPort", "8080");
        // 設(shè)置不需要通過代理服務(wù)器訪問的主機(jī),可以使用*通配符,多個(gè)地址用|分隔
        prop.setProperty("http.nonProxyHosts", "localhost|192.168.0.*");
        // 設(shè)置安全訪問使用的代理服務(wù)器地址與端口
        // 它沒有https.nonProxyHosts屬性,它按照http.nonProxyHosts 中設(shè)置的規(guī)則訪問
        prop.setProperty("https.proxyHost", "192.168.0.254");
        prop.setProperty("https.proxyPort", "443");
        // 使用ftp代理服務(wù)器的主機(jī)、端口以及不需要使用ftp代理服務(wù)器的主機(jī)
        prop.setProperty("ftp.proxyHost", "192.168.0.254");
        prop.setProperty("ftp.proxyPort", "2121");
        prop.setProperty("ftp.nonProxyHosts", "localhost|192.168.0.*");
        // socks代理服務(wù)器的地址與端口
        prop.setProperty("socksProxyHost", "192.168.0.254");
        prop.setProperty("socksProxyPort", "8000");
        // 設(shè)置登陸到代理服務(wù)器的用戶名和密碼
        Authenticator.setDefault(new MyAuthenticator("userName", "Password"));
    }
    static class MyAuthenticator extends Authenticator {
        private String user = "";
        private String password = "";
        public MyAuthenticator(String user, String password) {
            this.user = user;
            this.password = password;
        }
        protected PasswordAuthentication getPasswordAuthentication() {
            returnnew PasswordAuthentication(user, password.toCharArray());
        }
    }

方法二使用Proxy來對每個(gè)連接實(shí)現(xiàn)代理, 這種方法只能在jdk 1.5以上的版本使用(包含jdk1.5), 優(yōu)點(diǎn)是可以單獨(dú)的設(shè)置每個(gè)連接的代理, 缺點(diǎn)是設(shè)置比較麻煩:
復(fù)制代碼 代碼如下:

    public static void main(String[] args) {
        try {
            URL url = new URL("http://www.baidu.com");
            // 創(chuàng)建代理服務(wù)器
            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的名字, 可以直接使用
            // 結(jié)束
            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();
        }
    }

相關(guān)文章

  • 教你怎么用Java完成人民幣大寫轉(zhuǎn)化

    教你怎么用Java完成人民幣大寫轉(zhuǎn)化

    這篇文章主要介紹了教你怎么用Java完成人民幣大寫轉(zhuǎn)化,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • 淺談hashmap為什么查詢時(shí)間復(fù)雜度為O(1)

    淺談hashmap為什么查詢時(shí)間復(fù)雜度為O(1)

    這篇文章主要介紹了hashmap為什么查詢時(shí)間復(fù)雜度為O(1),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springboot實(shí)現(xiàn)定時(shí)任務(wù)的四種方式小結(jié)

    springboot實(shí)現(xiàn)定時(shí)任務(wù)的四種方式小結(jié)

    本文主要介紹了springboot實(shí)現(xiàn)定時(shí)任務(wù)的四種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 如何對jdk版本升級或降級

    如何對jdk版本升級或降級

    這篇文章主要介紹了如何對jdk版本升級或降級方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java代碼審計(jì)之URL重定向的問題解決

    Java代碼審計(jì)之URL重定向的問題解決

    URLRedirect url重定向漏洞也稱url任意跳轉(zhuǎn)漏洞,網(wǎng)站信任了用戶的輸入導(dǎo)致惡意攻擊,本文主要介紹了Java代碼審計(jì)之URL重定向的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • elasticsearch源碼分析index?action實(shí)現(xiàn)方式

    elasticsearch源碼分析index?action實(shí)現(xiàn)方式

    這篇文章主要為大家介紹了elasticsearch源碼分析index?action實(shí)現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • mybatis mybatis-plus-generator+clickhouse自動生成代碼案例詳解

    mybatis mybatis-plus-generator+clickhouse自動生成代碼案例詳解

    這篇文章主要介紹了mybatis mybatis-plus-generator+clickhouse自動生成代碼案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java中的@Builder注解問題詳解

    Java中的@Builder注解問題詳解

    這篇文章主要介紹了Java中的@Builder注解詳解,@Builder 注解的其中一個(gè)大坑會導(dǎo)致默認(rèn)值失效,這是使用此注解出現(xiàn)的一個(gè)問題,總的來說,不推薦再使用 @Builder 注解,接下來講重點(diǎn)介紹其原因和替代方案,需要的朋友可以參考下
    2023-10-10
  • 解決zuulGateway網(wǎng)關(guān)添加路由異常熔斷問題

    解決zuulGateway網(wǎng)關(guān)添加路由異常熔斷問題

    這篇文章主要介紹了解決zuulGateway網(wǎng)關(guān)添加路由異常熔斷問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Spring Junit單元測試加載配置文件失敗問題

    Spring Junit單元測試加載配置文件失敗問題

    這篇文章主要介紹了Spring Junit加載配置文件失敗問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評論

岑溪市| 洛阳市| 嘉定区| 定结县| 错那县| 晴隆县| 丹江口市| 安溪县| 遂溪县| 太原市| 英德市| 凉山| 安图县| 昌图县| 周至县| 云龙县| 神木县| 昭通市| 密山市| 凉城县| 广西| 舒城县| 成都市| 登封市| 万州区| 高台县| 南宁市| 黄龙县| 和林格尔县| 沿河| 朔州市| 尉氏县| 呈贡县| 辽宁省| 成安县| 庆元县| 通河县| 余干县| 高安市| 彝良县| 台东县|