1. 程式人生 > >HTTP與TCP的關系

HTTP與TCP的關系

bbb 什麽 img 關閉 html 如果 web amp sem

一直比較想寫TCP與HTTP之間的關系,HTTP報文是如何通過tcp發送的,HTTP報文形式內容如何。

HTTP請求包含請求行,請求頭,請求體

HTTP響應包含響應頭,響應頭,響應體

下面我準備通過JAVA自帶的socket創建一個HTTP服務,這樣就可以直到HTTP整個內容了。

技術分享圖片
public static void main(String[] args) throws Exception {
        ServerSocket ss = null;
        Socket socket = null;
        BufferedReader br = null;
        BufferedWriter bw 
= null; try { //1.創建socket連接 ss = new ServerSocket(8081); //循環等待 while (true) { //2.堵塞,直到有新的連接進來 socket = ss.accept(); //3.設置讀寫緩沖區 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); bw
= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String s; int contentLength = 0; //4.輸出請求體中的內容,並且將Content-Length的值賦值給contentLength,確定post請求體的大小 while ((s = br.readLine()) != null && !s.isEmpty()) { System.out.println(s);
if (s.indexOf("Content-Length") != -1) { contentLength = Integer.parseInt(s.substring(s.indexOf("Content-Length") + 16)); } } //5.如果有請求體,通過read方法讀取請求體中的內容 if (contentLength != 0) { char[] buf = null; if (contentLength != 0) { buf = new char[contentLength]; br.read(buf, 0, contentLength); System.out.println("The data user posted: " + new String(buf)); } } //6 設置響應體內容 bw.write("HTTP/1.1 200 OK\n"); bw.write("Content-Type: text/html; charset=UTF-8\n\n"); bw.write("<html>\n" + "<head>\n" + " <title>first page</title>\n" + "</head>\n" + "<body>\n" + " <h1>Hello World!" + "</h1>\n" + "</body>\n" + "</html>\n"); //7.沖刷到瀏覽器,即使關閉資源,不然可能導致瀏覽器一直等待服務器數據 bw.flush(); bw.close(); br.close(); socket.close(); } } catch (IOException e) { e.printStackTrace(); } finally { //關閉資源 ss.close(); } }
View Code

首先我在瀏覽器中輸入http://localhost:8081/?username=tt 網址(使用不同的瀏覽器請求報文可能有些差異,比如你安裝的某些插件
導致插件也會向服務器發出請求),下面來看看這個在服務器接收到的是什麽內容

技術分享圖片
//首先是請求行,包含請求方式,相對路徑,HTTP協議,占一行(也就是說後面接上了\n)
    GET /?username=tt HTTP/1.1
    //之後就是請求體,主要包括Accept,Accept-Language,User-Agent,Accept-Encoding,Host,Connection,每一個都獨占一行
    Accept: text/html, application/xhtml+xml, image/jxr, */*
    Accept-Language: zh-CN
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299
    Accept-Encoding: gzip, deflate
    Host: localhost:8081
    Connection: Keep-Alive
    //由於GET沒有請求體,所以不會出現請求體內容,如果是post請求則會有請求體內容
View Code

之後再來看看響應體寫法

技術分享圖片
//1.設置響應體 包含HTTP協議版本,狀態碼, 狀態碼說明
    bw.write("HTTP/1.1 200 OK\n");
    //2.設置響應頭,主要是相應提編碼以及MIME類型方便瀏覽器解析
    bw.write("Content-Type: text/html; charset=UTF-8\n\n");
    //3.設置響應體,與HTML類似
    bw.write("<html>\n" +
            "<head>\n" +
            "    <title>first page</title>\n" +
            "</head>\n" +
            "<body>\n" +
            "    <h1>Hello World!"+"</h1>\n" +
            "</body>\n" +
            "</html>\n");
View Code

HTTP與TCP的關系