我的漫漫程序之旅

          專注于JavaWeb開發(fā)
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數據加載中……

          HttpURLConnection請求數據流的寫入(write)和讀取(read)

          URLConnection類給應用程序和web資源之間架設起了通信的橋梁,這些web資源通常是通過url來標記的,本文將講述如何使用HttpURLConnection來訪問web頁面(發(fā)送數據流)和讀取數據流。

          在Servlet中對于需要用post方式(get會暴露參數)寫入參數的時候就用到了HttpURLConnection.

          請求的Servlet,也可以寫入main方法中進行測試
          package com;

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.io.OutputStream;
          import java.io.OutputStreamWriter;
          import java.net.HttpURLConnection;
          import java.net.URL;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          @SuppressWarnings(
          "serial")
          public class IOServlet extends HttpServlet
          {
              
          /**
               * 對于主動請求其它接口的參數流寫入(POST方式)
               
          */

              
          public void doGet(HttpServletRequest request, HttpServletResponse response)
                      
          throws ServletException, IOException
              
          {
                  System.out.println(
          "begin send");
                  String inputParam 
          = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><page><username>愛心天使</usernaem><age>26</age></page>";

                  URL url 
          = null;
                  HttpURLConnection httpConn 
          = null;
                  OutputStream output 
          = null;
                  OutputStreamWriter outr 
          = null;

                  url 
          = new URL("http://127.0.0.1:8888/iotest/ReadServlet");
                  httpConn 
          = (HttpURLConnection) url.openConnection();
                  HttpURLConnection.setFollowRedirects(
          true);
                  httpConn.setDoOutput(
          true);
                  httpConn.setRequestMethod(
          "POST");
                  httpConn.setRequestProperty(
          "Content-Type""text/xml");
                  httpConn.connect();
                  output 
          = httpConn.getOutputStream();
                  outr 
          = new OutputStreamWriter(output);
                  
          // 寫入請求參數
                  outr.write(inputParam.toString().toCharArray(), 0, inputParam
                          .toString().length());
                  outr.flush();
                  outr.close();
                  System.out.println(
          "send ok");
                  
          int code = httpConn.getResponseCode();
                  System.out.println(
          "code " + code);
                  System.out.println(httpConn.getResponseMessage());
                  
                  
          //讀取響應內容
                  String sCurrentLine = ""
                  String sTotalString 
          = ""
                  
          if (code == 200)
                  
          {
                      java.io.InputStream is 
          = httpConn.getInputStream();
                      BufferedReader reader 
          = new BufferedReader(
                              
          new InputStreamReader(is));
                      
          while ((sCurrentLine = reader.readLine()) != null)
                          
          if (sCurrentLine.length() > 0)
                              sTotalString 
          = sTotalString + sCurrentLine.trim();
                  }
           else
                  
          {
                      sTotalString 
          = "遠程服務器連接失敗,錯誤代碼:" + code;

                  }

                  System.out.println(
          "response:" + sTotalString);

              }


              
          public void doPost(HttpServletRequest request, HttpServletResponse response)
                      
          throws ServletException, IOException
              
          {
                  
          this.doGet(request, response);
              }


          }


          ReadServlet(相當于被請求的服務器):

          package com;

          import java.io.IOException;
          import java.io.PrintWriter;
          import javax.servlet.ServletException;
          import javax.servlet.ServletInputStream;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          @SuppressWarnings(
          "serial")
          public class ReadServlet extends HttpServlet
          {

              
          public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException
              
          {
                  System.out.println(
          "begin read");
                  ServletInputStream inStream 
          = request.getInputStream(); // 取HTTP請求流
                  int size = request.getContentLength(); // 取HTTP請求流長度
                  byte[] buffer = new byte[size]; // 用于緩存每次讀取的數據 
                  byte[] in_b = new byte[size]; // 用于存放結果的數組
                  int count = 0;
                  
          int rbyte = 0;
                  
          // 循環(huán)讀取 
                  while (count < size)
                  

                      rbyte 
          = inStream.read(buffer); // 每次實際讀取長度存于rbyte中 sflj
                      for (int i = 0; i < rbyte; i++)
                      
          {
                          in_b[count 
          + i] = buffer[i];
                      }

                      count 
          += rbyte;
                  }

                  System.out.println(
          "result:" + new String(in_b,0,in_b.length));
                  
                  response.setContentType(
          "text/html");
                  
          //注意響應中文數據時要設置
                  response.setCharacterEncoding("GBK");
                  PrintWriter out 
          = response.getWriter();
                  
          //回與響應數據
                  out.write("您已經請求成功,這是響應數據!");
              }

              
              
          public void doPost(HttpServletRequest request, HttpServletResponse response)
                      
          throws ServletException, IOException
              
          {
                  
          this.doGet(request, response);
              }


          }


          打開頁面:http://localhost:8888/iotest/IOServlet

          你會在后臺看到如下輸出說明你已經成功了:
          begin send
          send ok
          begin read
          result:
          <?xml version="1.0" encoding="UTF-8"?><page><username>愛心天使</usernaem><age>26</age></page>
          code 
          200
          OK
          response:您已經請求成功,這是響應數據
          !


          源碼下載:here

          posted on 2008-12-20 11:19 々上善若水々 閱讀(19092) 評論(1)  編輯  收藏

          評論

          # re: HttpURLConnection請求數據流的寫入(write)和讀取(read)  回復  更多評論   

          恩,不錯
          2008-12-20 22:58 | @beyondwcm

          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          主站蜘蛛池模板: 无棣县| 襄城县| 徐闻县| 罗定市| 西林县| 扎兰屯市| 临泽县| 呼玛县| 郸城县| 天峻县| 门源| 巴林左旗| 遵义县| 甘孜县| 榆林市| 新宾| 故城县| 清河县| 柞水县| 临高县| 姚安县| 泰安市| 鸡西市| 体育| 库尔勒市| 台山市| 岱山县| 恭城| 泗水县| 灵寿县| 梓潼县| 栾城县| 鹤峰县| 新乐市| 乾安县| 分宜县| 原阳县| 六枝特区| 巨鹿县| 天津市| 哈尔滨市|