<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    天空是藍色的

    做好軟件為中國 #gcc -c helloworld.c -o helloworld.o //編譯目標文件 #gcc helloworld.o -o helloworld //編譯成可執(zhí)行exe #helloworld //運行exe
    數(shù)據(jù)加載中……
    代碼中通過代理訪問外部資源(轉貼)
    http://spaces.msn.com/members/savagardn/Blog/cns!1pzu-0W6-WxMGeUbOUArh6Eg!105.entry

    目前網(wǎng)絡上最流行的協(xié)議就是HTTP協(xié)議。HTTP協(xié)議有許多優(yōu)點,例如它能夠穿越防火墻。同時HTTP也是很多其他協(xié)議的基礎,例如SOAP協(xié)議就是建立在HTTP協(xié)議之上的。

    Java通過兩種API對HTTP提供支持,一種是servlet API,它覆蓋了服務器端的編程問題;另一種是java.net包,它通過HttpURLConnection類在客戶端提供了對HTTP協(xié)議的支持。但是我在使用servlet API的時候曾經遇到過一些問題。本文將介紹我曾遇到過的一些問題和相應的解決辦法。

    基礎知識

    通常在企業(yè)網(wǎng)絡中,一個終端通過代理服務器同互聯(lián)網(wǎng)連接起來,代理服務器負責監(jiān)視網(wǎng)絡流量和執(zhí)行安全規(guī)則。在java.net API中,軟件可以通過兩個屬性來支持代理服務器,它們分別是http.proxyHost和http.proxyPort。它們必須被設定為相應的代理服務器和端口,下面的代碼展示了如何設定這兩個屬性:

    String url = "http://www.digitalcq.com/",
       proxy = "proxy.digitalcq.com",
       port = "8080";
    URL server = new URL(url);
    Properties systemProperties = System.getProperties();
    systemProperties.setProperty("http.proxyHost",proxy);
    systemProperties.setProperty("http.proxyPort",port);
    HttpURLConnection connection = (
        HttpURLConnection)server.openConnection();
    connection.connect();
    InputStream in = connection.getInputStream();
    readResponse(in);


    在上面的程序中,你需要根據(jù)實際情況設定代理服務器和端口。如果你不知道該如何設置的話,可以詢問你們公司的網(wǎng)絡管理員。

    使用驗證

    通常公司會要求員工在連接到互聯(lián)網(wǎng)之前登錄到代理服務器。通過登錄這種機制使公司可以更好的監(jiān)控員工對互聯(lián)網(wǎng)的使用,例如監(jiān)控員工都訪問了哪些網(wǎng)站。HttpURLConnection通過驗證類支持代理服務器驗證。下面是一個如何利用HttpURLConnection類進行驗證的例子。首先需要實現(xiàn)一個驗證者:

    public class SimpleAuthenticator
       extends Authenticator
    {
       private String username,
                      password;
        public SimpleAuthenticator(String username,String password)
       {
          this.username = username;
          this.password = password;
       }
        protected PasswordAuthentication getPasswordAuthentication()
       {
          return new PasswordAuthentication(
                 username,password.toCharArray());
       }
    }


    然后,通過Authenticator.setDefault()方法注冊驗證者:

    String url = "http://www.digitalcq.com/",
           proxy = "proxy.digitalcq.com",
           port = "8080",
           username = "usr",
           password = "pwd";
    Authenticator.setDefault(new SimpleAuthenticator(
           username,password));
    URL server = new URL(url);
    Properties systemProperties = System.getProperties();
    systemProperties.setProperty("http.proxyHost",proxy);
    systemProperties.setProperty("http.proxyPort",port);
    HttpURLConnection connection = (
        HttpURLConnection)server.openConnection();
    connection.connect();
    InputStream in = connection.getInputStream();
    readResponse(in);


    問題

    上面介紹的都是HttpURLConnection類能夠正常工作的情況。但是我在實際情況中遇到了一些網(wǎng)絡,在這些網(wǎng)絡中,HttpURLConnection類無法正常工作。最后我發(fā)現(xiàn)關鍵的問題在于使用了不正確的DNS配置。在實際情況中,HttpURLConnection類總是先嘗試利用DNS服務器來解析地址名稱。通常情況下,這種嘗試會失敗,而代理服務器會將連接重新定向。但是某些DNS服務器會返回一些不正確的響應,從而導致程序拋出UnknownHostException異常。作為一個程序員,系統(tǒng)不會為了你的程序更改DNS服務器的配置,因此你需要找出解決這個問題的方法。我的方案是通過自己實現(xiàn)HTTP協(xié)議來解決這個問題。例如一個GET命令可以用下面的代碼來實現(xiàn):

    String url = "http://www.digitalcq.com/",
           proxy = "proxy.digitalcq.com",
           port = "8080",
           authentication = "usr:pwd";
    URL server = new URL(url);
    Socket socket = new Socket(proxy,port);
    Writer writer = new OutputStreamWriter(socket.getOutputStream(),
                                           "US-ASCII");
    writer.write("GET " + server.toExternalForm() + " HTTP/1.0\r\n");
    writer.write("Host: " + server.getHost() + "\r\n");
    writer.write("Proxy-Authorization: Basic "
                 + new sun.misc.BASE64Encoder().encode(
                   authentication.getBytes())
                 + "\r\n\r\n");
    writer.flush();
    BufferedReader reader = new BufferedReader(new InputStreamReader(
                                socket.getInputStream(),"US-ASCII"));
    String line = reader.readLine();
    if(line != null && line.startsWith("HTTP/"))
    {
       int sp = line.indexOf(' ');
       String status = line.substring(sp + 1,sp + 4);
       if(status.equals("200"))
       {
          while(line.length() != 0)
             line = reader.readLine();
          readResponse(reader);
       }
       else
          throw new FileNotFoundException("Host reports error " +
                                           status);
    }
    else
       throw new IOException("Bad protocol");
    reader.close();
    writer.close();
    socket.close();


    在上面的代碼中,大家可以注意到代理服務器的用戶名和密碼的格式是:

    username:password,

    并且程序對它們基于Base 64進行了編碼。如果需要參考HTTP協(xié)議,可以到http://www.ietf.org/rfc/rfc2616.txt

    posted on 2005-11-07 15:44 bluesky 閱讀(492) 評論(0)  編輯  收藏 所屬分類: 基礎知識

    主站蜘蛛池模板: 一级做a爰黑人又硬又粗免费看51社区国产精品视 | **一级毛片免费完整视| 亚洲一卡2卡3卡4卡国产网站| 妞干网手机免费视频| 亚洲免费视频一区二区三区| 亚洲国产精久久久久久久| 无码中文在线二区免费| 一级毛片免费全部播放| 91情国产l精品国产亚洲区| 日本高清免费不卡视频| A片在线免费观看| 亚洲精品V天堂中文字幕| 国产成人无码综合亚洲日韩| 日韩精品免费一区二区三区| 最近2019中文免费字幕在线观看| 亚洲色中文字幕在线播放| 亚洲av网址在线观看| 国产乱子伦精品免费女| 欧洲一级毛片免费| WWW免费视频在线观看播放 | 亚欧免费无码aⅴ在线观看| 国产精品亚洲专区无码唯爱网| 久久亚洲国产精品| 亚洲AV无码成H人在线观看| 国产人成免费视频网站| 999zyz**站免费毛片| 国产亚洲一卡2卡3卡4卡新区| 亚洲国产成人久久| 亚洲va国产va天堂va久久| 亚洲第一页综合图片自拍| 91情侣在线精品国产免费| 久久青草91免费观看| 久久成人永久免费播放| 久久久久久亚洲精品无码| 91亚洲va在线天线va天堂va国产| 国产成人亚洲影院在线观看| 在线看片无码永久免费aⅴ| 麻豆最新国产剧情AV原创免费| 黄色网址在线免费| GOGOGO免费观看国语| 色婷婷综合缴情综免费观看|