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
在Servlet中對于需要用post方式(get會暴露參數)寫入參數的時候就用到了HttpURLConnection.
請求的Servlet,也可以寫入main方法中進行測試















































































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



















































打開頁面:http://localhost:8888/iotest/IOServlet
你會在后臺看到如下輸出說明你已經成功了:








源碼下載:here