Http協議簡單學習筆記

HTTP是hypertext transfer protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用於定義WEB瀏覽器與WEB服務器之間交換數據的過程。
HTTP1.0 協議中,客戶端與 web 服務器創建鏈接後,只能得到一個 web 資源。
HTTP1.1 協議,容許客戶端與 web 服務器創建鏈接後,在一個鏈接上獲取多個 web 資源。
咱們能夠經過使用 telnet 舉例說明
 
一個好多同窗搞不清楚的問題:
  一個 web 頁面中,使用 img 標籤引用了三幅圖片,當客戶端訪問服務器中的這個 web 頁面時,客戶端總共會訪問幾回服務器,即向服務器發送了幾回 HTTP 請求。
  答案是四次,首先請求該資源獲得服務器發過來的信息,而後解析到img標籤引用的資源以後,而後每一個圖片都會想服務器發送請求。 因此總過四次。 因此前段設計的好壞也很大程度上影響服務器的工做效率。
 
 
HTTP請求:
客戶端連上服務器後,向服務器請求某個 web 資源,稱之爲客戶端向服務器發送了一個 HTTP 請求。一個完整的 HTTP 請求包括以下內容:

一個請求行、若干消息頭、以及實體內容,以下所示html

 

 

 

請求行中的GET稱之爲請求方式,請求方式有:
  •POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
  •經常使用的有: GET、 POST
  •用戶如沒有設置,默認狀況下瀏覽器向服務器發送的都是get請求,例如在瀏覽器直接輸地址訪問,點超連接訪問等都是get,用戶如想把請求方式改成post,可經過更改表單的提交方式實現。
無論POST或GET,都用於向服務器請求某個WEB資源,這兩種方式的區別主要表如今數據傳遞上:
•如請求方式爲GET方式,則能夠在請求的URL地址後以?的形式帶上交給服務器的數據,多個數據之間以&進行分隔,例如:
       GET /mail/1.html?name=abc&password=xyz HTTP/1.1
      GET方式的特色:在URL地址後附帶的參數是有限制的,其數據容量一般不能超過1K。
•如請求方式爲POST方式,則能夠在請求的實體內容中向服務器發送數據,Post方式的特色:傳送的數據量無限制。

HTTP響應:java

狀態行

  格式: HTTP版本號 狀態碼 緣由敘述<CRLF>web

  舉例:HTTP/1.1 200 OK瀏覽器

l 狀態碼用於表示服務器對請求的處理結果,它是一個三位的十進制數。響應狀態碼分爲 5 類,以下所示:

狀態碼緩存

含義服務器

100~199post

表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程測試

200~299this

表示成功接收請求並已完成整個處理過程,經常使用200url

300~399

爲完成請求,客戶需進一步細化請求。例如,請求的資源已經移動一個新地址,經常使用302(你請求我我沒有讓你去找別人(location))、307和304(讓你去拿緩存的數據)

400~499

客戶端的請求有錯誤,經常使用404

500~599

服務器端出現錯誤,經常使用 500

 

 

 

package com.servlet.cn;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.zip.GZIPOutputStream;

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

public class ServletDemo extends HttpServlet {

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

	/*
	 * 測試Content-Disposition頭, 控制瀏覽器如下載的方式打卡圖片
	 */
	private void test4(HttpServletResponse response) throws IOException {
		response.setHeader("Content-Disposition", "attachment; filename=1.jpg");
		InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
		int len;
		byte[] b = new byte[1024];
		OutputStream out = response.getOutputStream();
		
		while ((len = in.read(b)) > 0) {
			out.write(b, 0, len);
		}
	}

	/*
	 * 測試refresh頭 ,註冊完成以後通過幾秒跳到主頁
	 */
	private void test3(HttpServletResponse response) throws IOException {
		//response.setHeader("Refresh", "3");  //每一個三秒刷新該頁面一次
		response.setHeader("refresh", "3;url=http://www.baidu.com"); //格三秒以後轉到百度首頁
		String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
		response.getOutputStream().write(data.getBytes());
	}

	/*
	 * 測試Content-Encoding 頭, 服務器壓縮後輸出到客戶端
	 */
	private void test2(HttpServletResponse response) throws IOException {
		System.out.println("lala");
		String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
		System.out.println("原始數據的長度: " + data.getBytes().length);
		
		ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
		GZIPOutputStream gout = new GZIPOutputStream(bout); //內容寫到內存
		gout.write(data.getBytes());
		gout.close();
		byte[] gzip = bout.toByteArray(); //從內存中取出壓縮後的數據
		System.out.println("壓縮後的大小:" + gzip.length);
		
		response.setHeader("Content-Encoding", "gzip");
		response.setHeader("Content-Length", gzip.length + "");
		response.getOutputStream().write(gzip);
	}

	/*
	 * 測試location頭, 重定向到另一個資源用在登錄以後跳到主頁
	 */
	private void test1(HttpServletResponse response) {
		response.setStatus(302);
		response.setHeader("location", "/Test/1.html");
	}

}

  

range頭實現斷點續傳功能:

a.txt是咱們要下載的資源

package com.http.cn;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class RangeDemo {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		URL url = new URL("http://localhost:8080/Test/a.txt");
		HttpURLConnection con= (HttpURLConnection) url.openConnection();
		con.setRequestProperty("Range", "bytes=5-");
		
		InputStream in = con.getInputStream();
		int len;
		byte[] b = new byte[1024];
		FileOutputStream out = new FileOutputStream("c:\\a.txt"); 
		while ((len=in.read(b)) > 0) {
			out.write(b, 0, len);
		}
	}

}
相關文章
相關標籤/搜索