http

一、什麼是Http協議

  1. 定義 

    超文本傳輸協議(HTTP,HyperText Transfer Protocol)定義了瀏覽器(即萬維網客戶進程)怎樣向萬維網服務器請求萬維網文檔,以及服務器怎樣把文檔傳給瀏覽器。從
    層次的角度看,Http是面向(transaction-oriented)應用層協議,它是萬維網能夠可靠地交換文件(包括文本、聲音、圖像等各種多媒體文件)的重要基礎

  2. 工作流程

    一次Http操作稱作一個事物,其工作過程可分爲四步:
    1)首先客戶機與服務器需要建立連接。只要單擊某個超鏈接,Http的工作開始
    2)建立連接後,客戶機發送一個請求給服務器,請求方式的格式爲:統一資源標識符(URL)、協議版本號,後面是MIME信息包括請求修飾符、客戶機信息和可能的內容
    3)服務器接到請求後,給予相應的相應信息,其格式爲一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,後面是MIME信息包括服務器信息、實體信息和可能的內容
    4)客戶端接收服務器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然後客戶機與服務器斷開連接

    如果在以上過程中某一步出現錯誤,那麼產生錯誤的信息將返回到客戶端,有顯示屏輸出,對於用戶來說,這些過程是由Http自己完成的,用戶只要用鼠標點擊,等待信息顯示就可以了



    Http協議永遠都是客戶端發起請求,服務器回送相應
    這樣就限制了使用Http協議,無法實現在客戶端沒有發起請求的時候,服務器將消息推送給客戶端
    Http協議是一個無狀態的協議,同一個客戶端的這次請求和上次的請求時沒有對應關係

  3. URL

    統一資源定位符(URL,英語Uniform Resource Locator的縮寫)也被稱爲網頁地址,是因特網上的標準的資源地址。
    URL的格式由下列三部分組成:
    第一部分是協議(或稱爲服務方式);
    第二部分是存有該資源的的主機IP地址(有時也包括端口號);
    第三部分是主機資源的具體地址。如目錄和文件名等。
    第一部分和第二部分之間用“://”符號隔開,第二部分和第三部分用“/”符號隔開。第一部分和第二部分是不可缺少的。第三部分有時可以省略。現在所有的URI都是URL


  4. Tcp三次握手

    SYN (synchronize[漢譯:同步,同步發生])。SYN是TCP/IP建立連接時使用的握手信號。在客戶機和服務器之間建立正常的TCP網絡連接時,客戶機首先發出一個SYN消息,服務器使用SYN-ACK應答表示接收到了這個消息,最後客戶機再以ACK(Acknowledgement[漢譯:確認字符 ,在數據通信傳輸中,接收站發給發送站的一種傳輸控制字符。它表示確認發來的數據已經接受無誤。 ])消息響應。這樣在客戶機和服務器之間才能建立起可靠的TCP連接,數據纔可以在客戶機和服務器之間傳遞。

    ACK (Acknowledgement),即確認字符,在數據通信中,接收站發給發送站的一種傳輸類控制字符。表示發來的數據已確認接收無誤。

    TCP/IP基礎 -------TCP三次握手



    現實生活中的例子男孩追女孩可以很好的表現Tcp的三次握



  5. http請求頭信息

    Remote Address:220.181.12.218:80
    Request URL:http://126.com/
    Request Method:GET
    Status Code:200 OK
    Cache-Control:max-age=3600
    Connection:keep-alive
    Content-Encoding:gzip
    Content-Type:text/html
    Date:Sun, 03 Apr 2016 09:25:41 GMT
    Expires:Sun, 03 Apr 2016 10:00:22 GMT
    Last-Modified:Wed, 30 Mar 2016 08:33:29 GMT
    Server:nginx
    Transfer-Encoding:chunked
    Vary:Accept-Encoding
    Vary:Accept-Encoding
    X-Cache:HIT from ntes_cache
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip, deflate, sdch
    Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
    Connection:keep-alive
    Cookie:nts_mail_user=w027000:-1:1; [email protected]|1442733332|0|other|11&22|shx&1442733332&mail126#shx&140100#10#0#0|150846&0|urs&easyread&mail163&mail126|[email protected]
    Host:126.com
    Upgrade-Insecure-Requests:1
    User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36


  6. Http請求的方式

    GET: 請求指定的頁面信息,並返回實體主體。
    POST: 請求服務器接受所指定的文檔作爲對所標識的URI的新的從屬實體。
    HEAD: 只請求頁面的首部。
    PUT: 從客戶端向服務器傳送的數據取代指定的文檔的內容。
    DELETE: 請求服務器刪除指定的頁面。
    OPTIONS: 允許客戶端查看服務器的性能。
    TRACE: 請求服務器在響應中的實體主體部分返回所得到的內容。
    PATCH: 實體中包含一個表,表中說明與該URI所表示的原內容的區別。
    MOVE: 請求服務器將指定的頁面移至另一個網絡地址。
    COPY: 請求服務器將指定的頁面拷貝至另一個網絡地址。
    LINK: 請求服務器建立鏈接關係。
    UNLINK: 斷開鏈接關係。
    WRAPPED: 允許客戶端發送經過封裝的請求。


  7. Http響應碼信息

    ① 客戶方錯誤
    100  繼續
    101  交換協議
    ② 成功
    200  OK
    201  已創建
    202  接收
    203  非認證信息
    204  無內容
    205  重置內容
    206  部分內容
    ③ 重定向
    300  多路選擇
    301  永久轉移
    302  暫時轉移
    303  參見其它
    304  未修改(Not Modified)
    305  使用代理
    ④ 客戶方錯誤
    400  錯誤請求(Bad Request)
    401  未認證
    402  需要付費
    403  禁止(Forbidden)
    404  未找到(Not Found)
    405  方法不允許
    406  不接受
    407  需要代理認證
    408  請求超時
    409  衝突
    410  失敗
    411  需要長度
    412  條件失敗
    413  請求實體太大
    414  請求URI太長
    415  不支持媒體類型
    ⑤ 服務器錯誤
    500  服務器內部錯誤
    501  未實現(Not Implemented)
    502  網關失敗
    504  網關超時
    505 HTTP版本不支持


  8. Http協議的主要特點可概括如下:

    1.支持客戶/服務器模式。
    2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不同。
    由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
    3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
    4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
    5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。


  9. OSI七層協議

    開放系統互連參考模型 (Open System Interconnect 簡稱OSI)是國際標準化組織(ISO)和國際電報電話諮詢委員會(CCITT)聯合制定的開放系統互連參考模型,爲開放式互連信息系統提供了一種功能結構的框架。它從低到高分別是:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。

    第一層:物理層
    物理層規定了激活、維持、關閉通信端點之間的機械特性、電氣特性、功能特性以及過程特性。該層爲上層協議提供了一個傳輸數據的物理媒體。在這一層,數據的單位稱爲比特(bit)。 屬於物理層定義的典型規範代表包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45、fddi令牌環網等。

    第二層:數據鏈路層
    數據鏈路層在不可靠的物理介質上提供可靠的傳輸。該層的作用包括:物理地址尋址、數據的成幀、流量控制、數據的檢錯、重發等。 在這一層,數據的單位稱爲幀(frame)。
    數據鏈路層協議的代表包括:ARP、RARP、SDLC、HDLC、PPP、STP、幀中繼等。
    (802.2、802.3ATM、HDLC、FRAME RELAY )
    ARP是網絡層的協議,但是它所工作的內容是鏈路層的。具體來說應該是在網絡層;

    第三層:網絡層
    網絡層負責對子網間的數據包進行路由選擇。網絡層還可以實現擁塞控制、網際互連等功能。
    在這一層,數據的單位稱爲數據包(packet)。
    網絡層協議的代表包括:IP、IPX、RIP、OSPF等。
    (IP、IPX、APPLETALK、ICMP)

    第四層:傳輸層
    傳輸層是第一個端到端,即主機到主機的層次。傳輸層負責將上層數據分段並提供端到端的、可靠的或不可靠的傳輸。此外,傳輸層還要處理端到端的差錯控制和流量控制問題。
    在這一層,數據的單位稱爲數據段(segment)。
    傳輸層協議的代表包括:TCP、UDP、SPX等。

    第五層:會話層
    會話層管理主機之間的會話進程,即負責建立、管理、終止進程之間的會話。會話層還利用在數據中插入校驗點來實現數據的同步。
    RPC、SQL、NFS 、X WINDOWS、ASP
     
    第六層:表示層
    表示層對上層數據或信息進行變換以保證一個主機應用層信息可以被另一個主機的應用程序理解。表示層的數據轉換包括數據的加密、壓縮、格式轉換等。
    ASCII、PICT、TIFF、JPEG、 MIDI、MPEG
     
    第七層:應用層
    應用層爲操作系統或網絡應用程序提供訪問網絡服務的接口。
    應用層協議的代表包括:Telnet、FTP、HTTP、SNMP等。
    HTTP,FTP,SNMP等
    加密解密是在網絡層完成的

    七層理解
    物理層:物理接口規範,傳輸比特流,網卡是工作在物理層的。
    數據層:成幀,保證幀的無誤傳輸,MAC地址,形成EHTHERNET幀
    網絡層:路由選擇,流量控制,IP地址,形成IP包
    傳輸層:端口地址,如HTTP對應80端口。TCP和UDP工作於該層,還有就是差錯校驗和流量控制。
    會話層:組織兩個會話進程之間的通信,並管理數據的交換使用NETBIOS和WINSOCK協議。QQ等軟件進行通訊因該是工作在會話層的。
    表示層:使得不同操作系統之間通信成爲可能。
    應用層:對應於各個應用軟件


  10. tcp/ip四層協議





二、http1.0和http1.1區別


HTTP/1.0每次請求都需要建立新的TCP連接,連接不能複用
HTTP/1.1新的請求可以在上次請求建立的TCP連接之上發送,連接可以複用。優點是減少重複進行TCP三次握手的開銷,提高效率。
HTTP1.1在Request消息頭裏多一個Host域,Http1.0則沒有這個域。
HTTP1.1增加了OPTIONS,PUT,DELETE,TRACE,CONNECT這些Request方法


三、HttpUrlConnection的介紹

以下代碼段是用webview加載百度網頁

public void run() {
        try {
            URL url = new URL(mUrl);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setReadTimeout(3000);
            if(httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                final StringBuffer sb = new StringBuffer();
                String str;
                while((str=bufferedReader.readLine()) != null){
                    sb.append(str);
                }
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mWebView.loadData(sb.toString(),"text/html;charset=utf-8",null);
                    }
                });
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


以下代碼段是下載圖片且顯示

public void run() {
        try {
            URL url = new URL(mUrl);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setReadTimeout(3000);
            if(httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
                InputStream inputStream = httpURLConnection.getInputStream();
                FileOutputStream fileOutputStream = new FileOutputStream(new File("/sdcard/1111.jpg"));
                byte []data = new byte[2 *1024];
                int len = 0;
                while ((len=inputStream.read(data)) != -1){
                    fileOutputStream.write(data,0,len);
                }
                final Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/1111.jpg");
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mImageView.setImageBitmap(bitmap);
                    }
                });
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



四、Http傳遞參數信息和傳遞方式post、get


jsp代碼
<form action="${pageContext.request.contextPath}/servlet/MyFirstServlet" method="post">
  			用戶名 : <input type="text" name="name"/><br><br><br>
  			密    碼 : <input type="password" name="password"/><br><br><br>
  			<input type="submit" />
</form>

Servlet

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		String password = request.getParameter("password");
		
		PrintWriter out = response.getWriter();
		out.print("name-->" + name + "  password--->" + password);
		System.out.println("name-->" + name + "  password--->" + password);
	}


android

String path = "http://10.0.1.55:8080/servlet/MyFirstServlet?name=" + name.getText() + "&password=" + password.getText();
  // doData(path,"GET");
  doData(path,"POST");

private void doData(final String path,final String method){
       new Thread(){
           @Override
           public void run() {
               try {
                   String str1 = path.split("\\?")[1];
                   String strUrl = "";
                   if(method.equals("GET")){
                       strUrl = path;
                   }else{
                       strUrl = path.split("\\?")[0];
                   }
                   URL url = new URL(strUrl);
                   HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                   httpURLConnection.setRequestMethod(method);
                   httpURLConnection.setConnectTimeout(3000);
                   if(method.equals("POST")){
                       OutputStream os = httpURLConnection.getOutputStream();
                       os.write(str1.getBytes());
                   }
                   InputStream  io = httpURLConnection.getInputStream();
                   BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(io));
                   StringBuffer sb = new StringBuffer();
                   String str;
                   while((str=bufferedReader.readLine()) != null){
                       sb.append(str);
                   }
                   Log.i("zjh","sb---->" + sb.toString());
               } catch (MalformedURLException e) {
                   e.printStackTrace();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }.start();
    }








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章