一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中的代理原理及代理使用示例

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

2019-12-12 14:55junjie JAVA教程

這篇文章主要介紹了Java中的代理原理及代理使用示例,本文講解了Java Socket編程中加入代理的2種方法,需要的朋友可以參考下

今天再測試Socket編程時,無法連接外網。公司用的是Http的代理。上網搜索也沒看太懂,所以花了大量時間來學習。看了HTTP和TCP協議的關系好,才有所明白。現在能通過Socket使用HTTP代理了,結果很簡單,過程卻好難。

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

HTTP:是應用層協議,是基于傳輸層協議的。

TCP: 是傳輸層協議,是基于網絡層協議的。

IP: 是網絡層協議。

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

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

 

復制代碼代碼如下:

//以下地址是代理服務器的地址  
Socket socket = new Socket("10.1.2.188", 80);  
//寫與的內容就是遵循HTTP請求協議格式的內容,請求百度  
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();  

 

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

 

復制代碼代碼如下:

//設置代理  
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();  

 

最后總結一下:

在使用HTTP代理的環境中,

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

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

 

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

復制代碼代碼如下:

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編程中加入代理示例

有些時候我們的網絡不能直接連接到外網, 需要使用http或是https或是socket代理來連接到外網, 這里是java使用代理連接到外網的一些方法,:方法一使用系統屬性來完成代理設置, 這種方法比較簡單, 但是不能對單獨的連接來設置代理:

復制代碼代碼如下:

    public static void main(String[] args) {
        Properties prop = System.getProperties();
        // 設置http訪問要使用的代理服務器的地址
        prop.setProperty("http.proxyHost", "192.168.0.254");
        // 設置http訪問要使用的代理服務器的端口
        prop.setProperty("http.proxyPort", "8080");
        // 設置不需要通過代理服務器訪問的主機,可以使用*通配符,多個地址用|分隔
        prop.setProperty("http.nonProxyHosts", "localhost|192.168.0.*");
        // 設置安全訪問使用的代理服務器地址與端口
        // 它沒有https.nonProxyHosts屬性,它按照http.nonProxyHosts 中設置的規則訪問
        prop.setProperty("https.proxyHost", "192.168.0.254");
        prop.setProperty("https.proxyPort", "443");
        // 使用ftp代理服務器的主機、端口以及不需要使用ftp代理服務器的主機
        prop.setProperty("ftp.proxyHost", "192.168.0.254");
        prop.setProperty("ftp.proxyPort", "2121");
        prop.setProperty("ftp.nonProxyHosts", "localhost|192.168.0.*");
        // socks代理服務器的地址與端口
        prop.setProperty("socksProxyHost", "192.168.0.254");
        prop.setProperty("socksProxyPort", "8000");
        // 設置登陸到代理服務器的用戶名和密碼
        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來對每個連接實現代理, 這種方法只能在jdk 1.5以上的版本使用(包含jdk1.5), 優點是可以單獨的設置每個連接的代理, 缺點是設置比較麻煩:

復制代碼代碼如下:

    public static void main(String[] args) {
        try {
            URL url = new URL("http://www.baidu.com");
            // 創建代理服務器
            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();
        }
    }

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品无码久久久久久久久 | 7mav视频 | 亚洲男人第一天堂 | 99在线免费观看视频 | 国产极品久久 | ai换脸杨幂被c在线观看 | 春光乍泄在线 | 国产suv精品一区二区四区三区 | 四虎网址在线 | 特黄特级毛片免费视 | 欧美一级乱妇老太婆特黄 | 国产成+人+亚洲+欧美综合 | 亚洲日韩精品欧美一区二区一 | 日本一级不卡一二三区免费 | 日本草草视频在线观看 | 美女露全身永久免费网站 | 暖暖的视频完整视频韩国免费 | 日剧整部剧护妻狂魔免费观看全集 | 亚洲精品免费视频 | 4455永久在线观免费看片 | 久久视热频国产这里只有精品23 | 国产精品亚洲一区二区 | 调教催眠改造np总攻 | 超级乱淫伦短篇在车上 | 办公室操秘书 | 双性鞭蒂软汁淋漓 | 国产精品夜色视频一级区 | 色中文字幕 | 国产亚洲视频在线 | 香蕉国产成版人视频在线观看 | 国产午夜免费 | 国产精品免费一级在线观看 | 嫩草视频在线观看视频播放 | 青青青国产成人久久111网站 | 久久91精品国产91久 | 五月激激激综合网色播免费 | 精品国产成人a区在线观看 精品高潮呻吟99AV无码视频 | 黑人破中国女人处 | 91制片厂制作果冻传媒八夷 | 免费观看在线观看 | 小寡妇好紧进去了好大看视频 |