1. 程式人生 > >Http協議以及模擬http請求發送數據

Http協議以及模擬http請求發送數據

我們 public w3c 註意 -s accep 情況 hat 資源定位

1 為什麽要使用http協議

  假設我現在有兩個客戶端瀏覽器,一個是google,一個是IE瀏覽器;我現在有兩個服務器,一個是tomcat,一個是JBoss;在最初的情況下是:如果google要往tomcat上發送數據,就一定要在消息的前面加上google;比如google:helloWorld!此時tomcat上需要接受數據,假設tomcat接受 數據的數據格式是:apache:helloWorld!;此時問題出現了,我們該怎麽識別數據,同樣的IE瀏覽器要往tomcat發送相同的數據,格式是IE:helloWorld!。此時該怎麽辦?

技術分享圖片

而且問題不單單這麽簡單;如果google瀏覽器和IE瀏覽器向JBoss服務器發送數據,JBoss如果接收數據的格式是redhat:helloWorld!.此時情況就要復雜的多;這樣看來除非自家的服務器識別自家的瀏覽器;我們不能要求用戶使用指定的瀏覽器訪問指定的網頁;實際中,我們確實可以使用任何瀏覽器訪問任何網頁。這就是因為有了http協議。http默認是無狀態的,而且端口為80端口;只有客戶端和服務端都遵循這個協議,數據的發送和接受就可以統一了,在任何服務器或者瀏覽器上都可以識別;

技術分享圖片

那麽Http協議究竟是怎麽對請求數據的格式和響應數據的格式做規定了;請看如下的敘述:

·1 HTTP協議請求數據的格式

  比如我訪問http://www.importnew.com/27777.html這個網頁,此時我們可以查看網絡;F12查看:

技術分享圖片

  1)請求方式:包括資源的URI(統一資源定位符,這裏可以理解為除去域名的資源地址)和請求方式(GET/POST。。。)

技術分享圖片

  2)請求頭

  技術分享圖片

  3)請求正文

    比如GET請求表單提交時username=xxx&pwd=xxx;在這裏需要註意的是請求頭和請求正文之間存在一行空格;表示請求頭結束;

2 http的版本

  HTTP1.0

    比如我們訪問一個網頁,存在8個資源,每一個資源都會建立一次連接,發送一次數據,響應一次數據,關閉一次連接,總共是8次連接,8次數據發送,8次數據的響應,8次連接的關閉;建立連接和關閉連接很消耗性能;

  HTTP1.1

    比如我們訪問一個網頁,存在8個資源,只會建立一次連接,每訪問一個資源發送一次數據,響應一次數據;最終只會關閉一次連接,總共是1次連接,8次數據發送,8次數據的響應,1次連接的關閉;改善了性能。

3 模擬httpClient發送數據

  在這裏我訪問我自己的項目,部署在tomcat下;地址是http://localhost:8080/leoshop/AboutBlank.jsp

以下的代碼是我模擬httpClient的GET請求;響應內容是jsp頁面的源代碼:

package com.asiaInfo.caozg.ch_01;

import java.net.*;
import java.io.*;

public class HttpClient {
    String host = "localhost";
    int port = 8080;
    Socket socket;

    public void createSocket() throws Exception {
        socket = new Socket(host, port);
    }


    public void communicate() throws Exception {
        StringBuffer sb = new StringBuffer("GET " + "/leoshop/AboutBlank.jsp" + " HTTP/1.1\r\n");
        sb.append("Host: localhost:8080\r\n");
        sb.append("Accept: */*\r\n");
        sb.append("Accept-Language: zh-cn\r\n");
        sb.append("Accept-Encoding: gzip, deflate\r\n");
        sb.append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 10.0)\r\n");
        sb.append("Connection: Keep-Alive\r\n\r\n");

        //發出HTTP請求
        OutputStream socketOut = socket.getOutputStream();
        socketOut.write(sb.toString().getBytes());
        socket.shutdownOutput();  //關閉輸出流


        InputStream socketIn = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(socketIn, "UTF-8"));
        String data;
        while ((data = br.readLine()) != null) {
            System.out.println(data);
        }
        socket.close();
    }

    public static void main(String args[]) throws Exception {
        HttpClient client = new HttpClient();
        client.createSocket();
        client.communicate();
    }
}

響應內容:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=8C02608AB1DBB0ED3608D9229C663002; Path=/leoshop; HttpOnly
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sat, 13 Jan 2018 17:32:17 GMT


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    ......
<head>
</head>
</body>
    ......

</body>
</html>

  

Http協議以及模擬http請求發送數據